{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5ef4f755",
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "import random\n",
    "import numpy as np\n",
    "from tqdm import trange\n",
    "from newspaper import Article\n",
    "\n",
    "import torch\n",
    "from torch import nn\n",
    "from torch.nn import functional as F\n",
    "from torch.utils.data import DataLoader, TensorDataset\n",
    " \n",
    "from transformers.models import gpt2\n",
    "from transformers import GPT2Config, GPT2LMHeadModel\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 319,
   "id": "faf7f70f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# define the config to be used\n",
    "vocab_size = 38\n",
    "tinyconf = GPT2Config(\n",
    "  vocab_size=vocab_size,\n",
    "  n_positions=1024,\n",
    "  n_ctx=1024,\n",
    "  n_embd=128,\n",
    "  n_layer=12,\n",
    "  n_head=8\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 329,
   "id": "8f04d372",
   "metadata": {},
   "outputs": [],
   "source": [
    "# from previous experiment\n",
    "text_lengths = np.array([  50,   59,   69,   79,   89,   99,  109,  118,  128,  138,  148,\n",
    "        158,  168,  177,  187,  197,  207,  217,  227,  236,  246,  256,\n",
    "        266,  276,  286,  295,  305,  315,  325,  335,  345,  354,  364,\n",
    "        374,  384,  394,  404,  414,  423,  433,  443,  453,  463,  473,\n",
    "        482,  492,  502,  512,  522,  532,  541,  551,  561,  571,  581,\n",
    "        591,  600,  610,  620,  630,  640,  650,  659,  669,  679,  689,\n",
    "        699,  709,  719,  728,  738,  748,  758,  768,  778,  787,  797,\n",
    "        807,  817,  827,  837,  846,  856,  866,  876,  886,  896,  905,\n",
    "        915,  925,  935,  945,  955,  964,  974,  984,  994, 1004, 1014,\n",
    "       1024])\n",
    "\n",
    "from time import time"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "884d0ca1",
   "metadata": {},
   "source": [
    "## Torch GPT"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 331,
   "id": "202467eb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Num params: 2515456\n"
     ]
    }
   ],
   "source": [
    "# startiGPT2LMHeadModelh GPT-2 from HF\n",
    "model = GPT2LMHeadModel(tinyconf)\n",
    "model.eval()\n",
    "print(\"Num params:\", model.num_parameters())\n",
    "\n",
    "@torch.no_grad()\n",
    "def generate(\n",
    "  input_ids,\n",
    "  max_length,\n",
    "  num_return_sequences = 10\n",
    "):\n",
    "  # if just a sequence, batchify\n",
    "  if len(input_ids.shape) == 1:\n",
    "    input_ids = input_ids.unsqueeze(0)\n",
    "\n",
    "  # since the hidden states for all `num_return_sequences` will be same\n",
    "  # we first run those and then tile\n",
    "  B, S = input_ids.shape\n",
    "\n",
    "  assert B == 1, \"Only 1 sequence at a time can be generated\"\n",
    "  \n",
    "  input_ids = torch.tile(input_ids, [num_return_sequences, 1])\n",
    "  \n",
    "  for i in range(S+1, max_length+1, 1):\n",
    "    logits = model(input_ids).logits[:, -1, :] # only the last token\n",
    "    \n",
    "    # sample next tokens randomly\n",
    "    probs = F.softmax(logits, dim=-1)\n",
    "    ix = torch.multinomial(probs, num_samples=1).view(-1, 1)\n",
    "    input_ids = torch.cat([input_ids, ix], dim = -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 324,
   "id": "fdc2269a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 33%|███▎      | 33/100 [24:26<49:37, 44.45s/it]   \n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-324-f3331a6a3731>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_length\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext_lengths\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext_lengths\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m   \u001b[0mst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m   \u001b[0mgenerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample_inputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_length\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      6\u001b[0m   \u001b[0mtime_per_seq_vanilla_gpt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmax_length\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mst\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/autograd/grad_mode.py\u001b[0m in \u001b[0;36mdecorate_context\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     25\u001b[0m         \u001b[0;32mdef\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     26\u001b[0m             \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 27\u001b[0;31m                 \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     28\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     29\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<ipython-input-323-5df0a278632e>\u001b[0m in \u001b[0;36mgenerate\u001b[0;34m(input_ids, max_length, num_return_sequences)\u001b[0m\n\u001b[1;32m     23\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     24\u001b[0m   \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_length\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 25\u001b[0;31m     \u001b[0mlogits\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput_ids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlogits\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# only the last token\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     26\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     27\u001b[0m     \u001b[0;31m# sample next tokens randomly\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_call_impl\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m    887\u001b[0m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    888\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 889\u001b[0;31m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    890\u001b[0m         for hook in itertools.chain(\n\u001b[1;32m    891\u001b[0m                 \u001b[0m_global_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/transformers/models/gpt2/modeling_gpt2.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input_ids, past_key_values, attention_mask, token_type_ids, position_ids, head_mask, inputs_embeds, encoder_hidden_states, encoder_attention_mask, labels, use_cache, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m    902\u001b[0m         \u001b[0mreturn_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mreturn_dict\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mreturn_dict\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muse_return_dict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    903\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 904\u001b[0;31m         transformer_outputs = self.transformer(\n\u001b[0m\u001b[1;32m    905\u001b[0m             \u001b[0minput_ids\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    906\u001b[0m             \u001b[0mpast_key_values\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpast_key_values\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_call_impl\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m    887\u001b[0m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    888\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 889\u001b[0;31m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    890\u001b[0m         for hook in itertools.chain(\n\u001b[1;32m    891\u001b[0m                 \u001b[0m_global_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/transformers/models/gpt2/modeling_gpt2.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input_ids, past_key_values, attention_mask, token_type_ids, position_ids, head_mask, inputs_embeds, encoder_hidden_states, encoder_attention_mask, use_cache, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m    750\u001b[0m                 )\n\u001b[1;32m    751\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 752\u001b[0;31m                 outputs = block(\n\u001b[0m\u001b[1;32m    753\u001b[0m                     \u001b[0mhidden_states\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    754\u001b[0m                     \u001b[0mlayer_past\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlayer_past\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_call_impl\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m    887\u001b[0m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    888\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 889\u001b[0;31m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    890\u001b[0m         for hook in itertools.chain(\n\u001b[1;32m    891\u001b[0m                 \u001b[0m_global_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/transformers/models/gpt2/modeling_gpt2.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, hidden_states, layer_past, attention_mask, head_mask, encoder_hidden_states, encoder_attention_mask, use_cache, output_attentions)\u001b[0m\n\u001b[1;32m    288\u001b[0m         \u001b[0moutput_attentions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    289\u001b[0m     ):\n\u001b[0;32m--> 290\u001b[0;31m         attn_outputs = self.attn(\n\u001b[0m\u001b[1;32m    291\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mln_1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhidden_states\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    292\u001b[0m             \u001b[0mlayer_past\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlayer_past\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_call_impl\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m    887\u001b[0m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    888\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 889\u001b[0;31m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    890\u001b[0m         for hook in itertools.chain(\n\u001b[1;32m    891\u001b[0m                 \u001b[0m_global_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/transformers/models/gpt2/modeling_gpt2.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, hidden_states, layer_past, attention_mask, head_mask, encoder_hidden_states, encoder_attention_mask, use_cache, output_attentions)\u001b[0m\n\u001b[1;32m    243\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    244\u001b[0m         \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmerge_heads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 245\u001b[0;31m         \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc_proj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    246\u001b[0m         \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresid_dropout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    247\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_call_impl\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m    887\u001b[0m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    888\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 889\u001b[0;31m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    890\u001b[0m         for hook in itertools.chain(\n\u001b[1;32m    891\u001b[0m                 \u001b[0m_global_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/transformers/modeling_utils.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m   1222\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1223\u001b[0m         \u001b[0msize_out\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnf\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1224\u001b[0;31m         \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maddmm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbias\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mview\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mweight\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1225\u001b[0m         \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mview\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0msize_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1226\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "sample_inputs = torch.randint(low = 0, high = vocab_size, size = (1, 10))\n",
    "time_per_seq_vanilla_gpt = {}\n",
    "for _, max_length in zip(trange(len(text_lengths)), text_lengths):\n",
    "  st = time()\n",
    "  generate(sample_inputs, max_length)\n",
    "  time_per_seq_vanilla_gpt[max_length] = time() - st"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 325,
   "id": "28868820",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_values([1.6622998714447021, 2.1930811405181885, 2.992302894592285, 4.197546005249023, 5.14570689201355, 6.395497798919678, 8.011377096176147, 8.973557949066162, 10.591028928756714, 12.37233304977417, 14.557507038116455, 17.12027907371521, 19.828334093093872, 22.53909397125244, 25.5178701877594, 28.907083988189697, 32.55218505859375, 36.469399213790894, 40.74887204170227, 45.735422134399414, 49.355974197387695, 54.34034514427185, 59.26567196846008, 64.68545269966125, 71.53783798217773, 76.03711295127869, 82.26391291618347, 85.60085558891296, 89.99368333816528, 95.99286603927612, 104.54243302345276, 110.8418390750885, 117.99759483337402])"
      ]
     },
     "execution_count": 325,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "time_per_seq_vanilla_gpt.values()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 334,
   "id": "5baa5bd9",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 100/100 [29:27<00:00, 17.67s/it]\n"
     ]
    }
   ],
   "source": [
    "sample_inputs = torch.randint(low = 0, high = vocab_size, size = (1, 10))\n",
    "hf_gpt = {}\n",
    "for _, max_length in zip(trange(len(text_lengths)), text_lengths):\n",
    "  st = time()\n",
    "  model.generate(sample_inputs, max_length, do_sample = True, num_return_sequences=10, pad_token_id = 50256)\n",
    "  hf_gpt[max_length] = time() - st"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 337,
   "id": "aae035d8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.54495478,  0.73299313,  0.89063501,  0.8986249 ,  1.10433006,\n",
       "        1.39928913,  1.48570991,  1.69396377,  1.79820895,  2.0881021 ,\n",
       "        2.33569813,  2.51664615,  2.8236711 ,  2.74206328,  3.06350803,\n",
       "        3.31710911,  3.92217016,  4.50567102,  4.63530302,  5.46945906,\n",
       "        4.54229307,  4.94176412,  5.30708218,  5.53489304,  5.55287886,\n",
       "        6.05769897,  6.55479288,  6.47484994,  6.66257071,  7.02209496,\n",
       "        7.227005  ,  7.45897579,  8.24314904,  7.8537209 ,  7.87742209,\n",
       "        8.58612514,  9.98917794,  9.76387882,  9.84815788, 10.37017703,\n",
       "       10.74239707, 11.12377501, 11.58302498, 11.92812705, 12.48084402,\n",
       "       12.77035689, 13.1333189 , 13.60988283, 14.03921103, 14.45418215,\n",
       "       15.24299717, 15.81887794, 16.71262121, 16.34567904, 16.66935301,\n",
       "       17.20844507, 17.86577606, 18.36354089, 18.84506202, 19.3054769 ,\n",
       "       19.76750112, 20.32446575, 20.85218191, 21.45198107, 22.07024384,\n",
       "       23.16882825, 23.12747598, 24.58696795, 23.89066076, 25.44354415,\n",
       "       27.26248407, 26.86530614, 27.20131779, 29.08896399, 28.16570878,\n",
       "       28.83509207, 31.397012  , 29.88769603, 30.73117709, 31.28997016,\n",
       "       31.95311689, 32.56238317, 33.18489814, 33.86880302, 34.29947424,\n",
       "       35.22009802, 35.93019819, 36.45086789, 37.04013205, 37.90798998,\n",
       "       38.68806195, 39.41154027, 40.73673224, 40.98018885, 41.63835025,\n",
       "       42.30890131, 41.36318588, 41.23907399, 41.78188992, 43.21324325])"
      ]
     },
     "execution_count": 337,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(list(hf_gpt.values()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 340,
   "id": "b529f51d",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  0%|          | 0/100 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "124439808\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 44%|████▍     | 44/100 [32:41<41:36, 44.59s/it]  \n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-340-dff5b9ca92bf>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      8\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_length\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext_lengths\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext_lengths\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      9\u001b[0m   \u001b[0mst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m   \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgenerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample_inputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_length\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdo_sample\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_return_sequences\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpad_token_id\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m50256\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     11\u001b[0m   \u001b[0mhf_gpt_small\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmax_length\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mst\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/autograd/grad_mode.py\u001b[0m in \u001b[0;36mdecorate_context\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     25\u001b[0m         \u001b[0;32mdef\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     26\u001b[0m             \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 27\u001b[0;31m                 \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     28\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     29\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/transformers/generation_utils.py\u001b[0m in \u001b[0;36mgenerate\u001b[0;34m(self, input_ids, max_length, min_length, do_sample, early_stopping, num_beams, temperature, top_k, top_p, repetition_penalty, bad_words_ids, bos_token_id, pad_token_id, eos_token_id, length_penalty, no_repeat_ngram_size, encoder_no_repeat_ngram_size, num_return_sequences, max_time, decoder_start_token_id, use_cache, num_beam_groups, diversity_penalty, prefix_allowed_tokens_fn, output_attentions, output_hidden_states, output_scores, return_dict_in_generate, forced_bos_token_id, forced_eos_token_id, **model_kwargs)\u001b[0m\n\u001b[1;32m   1007\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1008\u001b[0m             \u001b[0;31m# sample\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1009\u001b[0;31m             return self.sample(\n\u001b[0m\u001b[1;32m   1010\u001b[0m                 \u001b[0minput_ids\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1011\u001b[0m                 \u001b[0mlogits_processor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlogits_processor\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/transformers/generation_utils.py\u001b[0m in \u001b[0;36msample\u001b[0;34m(self, input_ids, logits_processor, stopping_criteria, logits_warper, max_length, pad_token_id, eos_token_id, output_attentions, output_hidden_states, output_scores, return_dict_in_generate, **model_kwargs)\u001b[0m\n\u001b[1;32m   1480\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1481\u001b[0m             \u001b[0;31m# forward pass to get next token\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1482\u001b[0;31m             outputs = self(\n\u001b[0m\u001b[1;32m   1483\u001b[0m                 \u001b[0;34m**\u001b[0m\u001b[0mmodel_inputs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1484\u001b[0m                 \u001b[0mreturn_dict\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# testing full GPT2 Small\n",
    "model = GPT2LMHeadModel.from_pretrained(\"gpt2\")\n",
    "model.eval()\n",
    "print(model.num_parameters())\n",
    "\n",
    "sample_inputs = torch.randint(low = 0, high = vocab_size, size = (1, 10))\n",
    "hf_gpt_small = {}\n",
    "for _, max_length in zip(trange(len(text_lengths)), text_lengths):\n",
    "  st = time()\n",
    "  model.generate(sample_inputs, max_length, do_sample = True, num_return_sequences=10, pad_token_id = 50256)\n",
    "  hf_gpt_small[max_length] = time() - st"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 343,
   "id": "51ea4152",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 4.66104198,  6.01691318,  7.20656204,  8.429111  ,  9.83679509,\n",
       "       11.12766981, 12.62173486, 13.91161394, 15.35557485, 16.85949302,\n",
       "       18.38110971, 20.11641026, 21.83768201, 23.38225818, 25.06135178,\n",
       "       26.83561707, 28.68084717, 30.51669407, 32.492589  , 34.13120389,\n",
       "       35.95620108, 37.91341186, 44.04446197, 43.17010403, 44.75529599,\n",
       "       47.77914095, 52.37193012, 55.93168211, 58.02335215, 56.84589434,\n",
       "       62.29041219, 63.25715995, 63.70156193, 65.28368807, 68.72804832,\n",
       "       70.68075681, 74.58965921, 79.20702791, 82.66970396, 82.34983492,\n",
       "       82.3500061 , 83.35055184, 81.76600194, 84.06219292])"
      ]
     },
     "execution_count": 343,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(list(hf_gpt_small.values()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 342,
   "id": "9a73588a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  9%|▉         | 9/100 [21:02<3:32:47, 140.30s/it]\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-342-24dc088a0bac>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_length\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext_lengths\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext_lengths\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m   \u001b[0mst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m   \u001b[0mgenerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample_inputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_length\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      6\u001b[0m   \u001b[0mtime_per_seq_vanilla_gpt_124\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmax_length\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mst\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/autograd/grad_mode.py\u001b[0m in \u001b[0;36mdecorate_context\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     25\u001b[0m         \u001b[0;32mdef\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     26\u001b[0m             \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 27\u001b[0;31m                 \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     28\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdecorate_context\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     29\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<ipython-input-331-5df0a278632e>\u001b[0m in \u001b[0;36mgenerate\u001b[0;34m(input_ids, max_length, num_return_sequences)\u001b[0m\n\u001b[1;32m     23\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     24\u001b[0m   \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mS\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_length\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 25\u001b[0;31m     \u001b[0mlogits\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput_ids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlogits\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# only the last token\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     26\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     27\u001b[0m     \u001b[0;31m# sample next tokens randomly\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_call_impl\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m    887\u001b[0m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    888\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 889\u001b[0;31m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    890\u001b[0m         for hook in itertools.chain(\n\u001b[1;32m    891\u001b[0m                 \u001b[0m_global_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/transformers/models/gpt2/modeling_gpt2.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input_ids, past_key_values, attention_mask, token_type_ids, position_ids, head_mask, inputs_embeds, encoder_hidden_states, encoder_attention_mask, labels, use_cache, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m    924\u001b[0m             \u001b[0mhidden_states\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhidden_states\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlm_head\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mweight\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    925\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 926\u001b[0;31m         \u001b[0mlm_logits\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlm_head\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhidden_states\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    927\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    928\u001b[0m         \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/nn/modules/module.py\u001b[0m in \u001b[0;36m_call_impl\u001b[0;34m(self, *input, **kwargs)\u001b[0m\n\u001b[1;32m    887\u001b[0m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slow_forward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    888\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 889\u001b[0;31m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    890\u001b[0m         for hook in itertools.chain(\n\u001b[1;32m    891\u001b[0m                 \u001b[0m_global_forward_hooks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/nn/modules/linear.py\u001b[0m in \u001b[0;36mforward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m     92\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     93\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mforward\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mTensor\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTensor\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 94\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlinear\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mweight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbias\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     95\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     96\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mextra_repr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Library/Python/3.8/lib/python/site-packages/torch/nn/functional.py\u001b[0m in \u001b[0;36mlinear\u001b[0;34m(input, weight, bias)\u001b[0m\n\u001b[1;32m   1751\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mhas_torch_function_variadic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1752\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mhandle_torch_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlinear\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbias\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbias\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1753\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_C\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_nn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlinear\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbias\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1754\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1755\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "sample_inputs = torch.randint(low = 0, high = vocab_size, size = (1, 10))\n",
    "time_per_seq_vanilla_gpt_124 = {}\n",
    "for _, max_length in zip(trange(len(text_lengths)), text_lengths):\n",
    "  st = time()\n",
    "  generate(sample_inputs, max_length)\n",
    "  time_per_seq_vanilla_gpt_124[max_length] = time() - st"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 344,
   "id": "f6043f9f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 37.19195414,  52.34601283,  76.42361617, 101.24192476,\n",
       "       125.88396978, 157.562819  , 195.53068709, 228.61091113,\n",
       "       270.90618801])"
      ]
     },
     "execution_count": 344,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(list(time_per_seq_vanilla_gpt_124.values()))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "17e26b8b",
   "metadata": {},
   "source": [
    "## ONNX runtime Transformer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 345,
   "id": "49613540",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "124439808"
      ]
     },
     "execution_count": 345,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# starting with GPT-2 from HF\n",
    "# model = GPT2LMHeadModel(tinyconf)\n",
    "model.eval()\n",
    "model.num_parameters()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 346,
   "id": "5fd928f9",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/yashbonde/Library/Python/3.8/lib/python/site-packages/transformers/models/gpt2/modeling_gpt2.py:170: TracerWarning: Converting a tensor to a Python float might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n",
      "  w = w / (float(v.size(-1)) ** 0.5)\n"
     ]
    }
   ],
   "source": [
    "# Export the model\n",
    "\n",
    "# since this is a very large model we cannot export this as a single ONNX graph\n",
    "# we pass argument use_external_data_format=True in torch.onnx.export(), last arg\n",
    "# this creates a weight blob for different layers. we create a folder for this\n",
    "# so everything is consolidated\n",
    "import os\n",
    "export_folder = \"./data/gpt\"\n",
    "export_onnx = export_folder + \"/model.onnx\"\n",
    "os.makedirs(export_folder, exist_ok=True)\n",
    "\n",
    "# unlike our MNIST example where the dimensionality of input was fixed to 784\n",
    "# BERT and transformer models can have 2D dynamic input/output\n",
    "dynamic_axes_dict = {\n",
    "  0:'batch_size',\n",
    "  1:'sequence_length'\n",
    "}\n",
    "\n",
    "# eval mode and \n",
    "model.eval()\n",
    "\n",
    "# since the input is fully dynamic, tiny sequence will work for trace\n",
    "sample_input = torch.randint(low = 0, high = tinyconf.vocab_size, size = (1, 4))\n",
    "\n",
    "# export model\n",
    "torch.onnx.export(\n",
    "  model = model,\n",
    "  args = (\n",
    "    sample_input,\n",
    "  ),                         # model input (or a tuple for multiple inputs)\n",
    "  f = export_onnx,           # where to save the model (can be a file or file-like object)\n",
    "  export_params=True,        # store the trained parameter weights inside the model file\n",
    "  opset_version=11,          # the ONNX version to export the model to\n",
    "  do_constant_folding=True,  # whether to execute constant folding for optimization\n",
    "  input_names = [\n",
    "    'input_ids'\n",
    "  ],                         # the model's input names\n",
    "  output_names = ['logits'], # the model's output names\n",
    "  dynamic_axes={\n",
    "    'input_ids': dynamic_axes_dict,\n",
    "    'logits': dynamic_axes_dict,\n",
    "  },                         # variable length axes\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 347,
   "id": "5a02ce76",
   "metadata": {},
   "outputs": [],
   "source": [
    "# check model: for models >2GB use onnx.checker\n",
    "import onnx\n",
    "onnx.checker.check_model(export_onnx)\n",
    "\n",
    "# next run the model and see\n",
    "import onnxruntime\n",
    "ort_session = onnxruntime.InferenceSession(export_onnx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 348,
   "id": "ded75169",
   "metadata": {},
   "outputs": [],
   "source": [
    "# correct solution:\n",
    "def softmax(x):\n",
    "  \"\"\"Compute softmax values for each sets of scores in x.\"\"\"\n",
    "  e_x = np.exp(x - np.max(x))\n",
    "  return e_x / e_x.sum(axis=0) # only difference"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 349,
   "id": "6fd6d4d8",
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate(\n",
    "  input_ids,\n",
    "  max_length,\n",
    "  num_return_sequences = 10,\n",
    "):\n",
    "  # if just a sequence, batchify\n",
    "  if len(input_ids.shape) == 1:\n",
    "    input_ids = input_ids.reshape(1, *input_ids.shape)\n",
    "\n",
    "  # since the hidden states for all `num_return_sequences` will be same\n",
    "  # we first run those and then tile\n",
    "  B, S = input_ids.shape\n",
    "\n",
    "  assert B == 1, \"Only 1 sequence at a time can be generated\"\n",
    "  \n",
    "  input_ids = np.tile(input_ids, [num_return_sequences, 1])\n",
    "  \n",
    "  for i in range(S+1, max_length+1, 1):\n",
    "    ort_inputs = {\"input_ids\": input_ids}\n",
    "    logits = ort_session.run(None, ort_inputs)[0][:, -1, :] # only the last token\n",
    "    \n",
    "    # sample next tokens randomly\n",
    "    new_tokens = np.asarray([np.random.multinomial(10, softmax(o)).argmax() for o in logits]).reshape(-1, 1)\n",
    "    input_ids = np.hstack([input_ids, new_tokens])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 350,
   "id": "c133c17d",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 0/100 [00:05<?, ?it/s]\n"
     ]
    },
    {
     "ename": "ValueError",
     "evalue": "sum(pvals[:-1]) > 1.0",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-350-541fcf4f348a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_length\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext_lengths\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext_lengths\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m   \u001b[0mst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m   \u001b[0mgenerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample_input\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_length\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      6\u001b[0m   \u001b[0mtime_per_seq_onnx_gpt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmax_length\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mst\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<ipython-input-349-79063b56a2dd>\u001b[0m in \u001b[0;36mgenerate\u001b[0;34m(input_ids, max_length, num_return_sequences)\u001b[0m\n\u001b[1;32m     21\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     22\u001b[0m     \u001b[0;31m# sample next tokens randomly\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m     \u001b[0mnew_tokens\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmultinomial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msoftmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mo\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlogits\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     24\u001b[0m     \u001b[0minput_ids\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0minput_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_tokens\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<ipython-input-349-79063b56a2dd>\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m     21\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     22\u001b[0m     \u001b[0;31m# sample next tokens randomly\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m     \u001b[0mnew_tokens\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmultinomial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msoftmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mo\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlogits\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     24\u001b[0m     \u001b[0minput_ids\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0minput_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_tokens\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32mmtrand.pyx\u001b[0m in \u001b[0;36mnumpy.random.mtrand.RandomState.multinomial\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: sum(pvals[:-1]) > 1.0"
     ]
    }
   ],
   "source": [
    "sample_input = np.random.randint(low = 0, high = vocab_size, size = (10))\n",
    "time_per_seq_onnx_gpt = {}\n",
    "for _, max_length in zip(trange(len(text_lengths)), text_lengths):\n",
    "  st = time()\n",
    "  generate(sample_input, max_length)\n",
    "  time_per_seq_onnx_gpt[max_length] = time() - st"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2eae6e61",
   "metadata": {},
   "source": [
    "## TransRNN (Vanilla + ONNXRuntime)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7958c311",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import sys\n",
    "sys.path.append(os.path.abspath(\"..\"))\n",
    "from t2rmodel import T2R"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 355,
   "id": "838d36ee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2916608"
      ]
     },
     "execution_count": 355,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# model = T2R.from_pretrained(\"gpt2\", feature_size = 32)\n",
    "# model.num_params\n",
    "tinyconf = GPT2Config(**tinyconf.__dict__, feature_size = 32)\n",
    "model = T2R(tinyconf)\n",
    "model.num_params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 356,
   "id": "8fc6bfcf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1024, 128])"
      ]
     },
     "execution_count": 356,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.wpe.weight.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 357,
   "id": "f0b9d343",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Preparing Model for inference\n"
     ]
    }
   ],
   "source": [
    "model.infer_init()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 358,
   "id": "10bf207e",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "def top_k_logits(logits, k):\n",
    "  v, ix = torch.topk(logits, k)\n",
    "  out = logits.clone()\n",
    "  out[out < v[:, [-1]]] = -1e10\n",
    "  return out\n",
    "\n",
    "def get_next_tokens(logits, top_k, do_sample, num_return_sequences):\n",
    "  # get probabilities\n",
    "  if top_k is not None:\n",
    "    logits = top_k_logits(logits, top_k)\n",
    "  probs = F.softmax(logits, dim=-1)\n",
    "\n",
    "  # get top_k tokens for each \n",
    "  if do_sample:\n",
    "    ix = torch.multinomial(probs, num_samples=num_return_sequences)\n",
    "  else:\n",
    "    _, ix = torch.topk(probs, k=num_return_sequences, dim=-1)\n",
    "\n",
    "  # get scores\n",
    "  # each_probs = probs[:, ix].view(-1)\n",
    "  # v, ix = torch.topk(each_probs, num_return_sequences )\n",
    "  # print(ix)\n",
    "\n",
    "  return ix\n",
    "\n",
    "# test vanilla generation\n",
    "@torch.no_grad()\n",
    "def vanilla_generation(\n",
    "  input_ids,\n",
    "  max_length,\n",
    "  num_return_sequences = 10,\n",
    "  top_k = 10,\n",
    "  do_sample = True\n",
    "):\n",
    "  assert model.infer_ready, \"Not ready for inference. see `T2RInfer.infer_init()`\"\n",
    "\n",
    "  # if just a sequence, batchify\n",
    "  if len(input_ids.shape) == 1:\n",
    "    input_ids = input_ids.unsqueeze(0)\n",
    "\n",
    "  # since the hidden states for all `num_return_sequences` will be same\n",
    "  # we first run those and then tile\n",
    "  B, S = input_ids.shape\n",
    "\n",
    "  assert B == 1, \"Only 1 sequence at a time can be generated\"\n",
    "  \n",
    "  # make the times list\n",
    "  st = time()\n",
    "  times = [st]\n",
    "  \n",
    "  s_rnn, z_rnn = model.init_hidden()\n",
    "  B,S = input_ids.shape\n",
    "  for i in range(S):\n",
    "    logits, s_rnn, z_rnn = model(input_ids[:, i].unsqueeze(0), s_rnn = s_rnn, z_rnn = z_rnn, i = i)\n",
    "    times.append(time())\n",
    "\n",
    "  ix = get_next_tokens(logits[:, -1, :], top_k, do_sample, num_return_sequences)\n",
    "  generated_tokens = [ix[0]]\n",
    "\n",
    "  if num_return_sequences > 1:\n",
    "    # tile rnn_states for multiple batch generation\n",
    "    s_rnn = [torch.tile(s, [num_return_sequences, 1, 1]) for s in s_rnn]\n",
    "    z_rnn = [torch.tile(z, [num_return_sequences, 1, 1]) for z in z_rnn]\n",
    "\n",
    "  for i in range(S, max_length - 1, 1):\n",
    "    logits, s_rnn, z_rnn = model(ix.view(num_return_sequences, 1), s_rnn = s_rnn, z_rnn = z_rnn, i = i)\n",
    "    ix = get_next_tokens(logits[:, -1, :], top_k, do_sample, num_return_sequences)\n",
    "    generated_tokens.append(ix[0])\n",
    "    \n",
    "    # add way to keep only the top scoring ones here\n",
    "    ix = ix[0]\n",
    "    \n",
    "    times.append(time())\n",
    "    \n",
    "  generated_tokens = [x.unsqueeze(-1) for x in generated_tokens]\n",
    "  generated_tokens = torch.cat(generated_tokens, dim = 1)\n",
    "  input_ids = torch.tile(input_ids, [num_return_sequences, 1])\n",
    "  full_seq = torch.cat([input_ids, generated_tokens], dim = 1)\n",
    "  # return full_seq\n",
    "  \n",
    "  # we return times for this test\n",
    "  return times"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 359,
   "id": "b1867788",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 10/10 [02:01<00:00, 12.20s/it]\n"
     ]
    }
   ],
   "source": [
    "# changing the method a little bit from GPTs, we instead let it generate maximum\n",
    "# number of tokens for `n` number of rounds and mean the values for each run\n",
    "# making the testing process much faster.\n",
    "\n",
    "sample_inputs = torch.randint(low = 0, high = vocab_size, size = (1, 10))\n",
    "time_per_seq_vanilla_t2r = []\n",
    "n_tests = 10\n",
    "for _ in trange(n_tests):\n",
    "  st = time()\n",
    "  this_run_times = vanilla_generation(\n",
    "    input_ids = sample_inputs,\n",
    "    max_length = 1024,\n",
    "  )\n",
    "  time_per_seq_vanilla_t2r.append(this_run_times)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 360,
   "id": "e81115e3",
   "metadata": {},
   "outputs": [],
   "source": [
    "vanilla_t2r = np.array(time_per_seq_vanilla_t2r)\n",
    "# for each case subtract the start time of that generation i.e. first token\n",
    "vanilla_t2r = vanilla_t2r[:, 1:] - vanilla_t2r[:, :1]\n",
    "vanilla_t2r = np.mean(vanilla_t2r, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 361,
   "id": "db1419ba",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x135465b50>]"
      ]
     },
     "execution_count": 361,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAAf6ElEQVR4nO3deVzVVf7H8dcBFTcUFXdENFBE0VLcss1ssTIrtSZn2mus36/JpmnMrcalcpn2mpnKxrapaRPNJUvTylYtLQVZVAQRyAXBFVC28/uD6/zIyVLuhe9d3s/Hg0fc7/3K/Ry+9OZw7jnfY6y1iIiI7wlyugAREakZBbiIiI9SgIuI+CgFuIiIj1KAi4j4qHp1+WLh4eE2KiqqLl9SRMTnbdiwYZ+1tvWJx+s0wKOioli/fn1dvqSIiM8zxmT/3HENoYiI+CgFuIiIj1KAi4j4KAW4iIiPUoCLiPgoBbiIiI9SgIuI+CgFuIhILTpQXMr0JSkcPlrm8a/9qwFujHnZGLPXGLO52rHHjDHpxpgkY8wiY0yYxysTEfFxq9P2cPFTn/PG2mzWZRZ6/OufSg/8VWD4Ccc+BnpZa3sDW4HJHq5LRMRnHSwp4/53N3H7a+tp1aQB7989hIvi2nr8dX51Kb219nNjTNQJx1ZWe7gWGOPhukREfNJnW/YyKTGZ/CPH+MPQaMYPi6FBvdoZrfbEvVBuA9452ZPGmHHAOIDIyEgPvJyIiPc5WFLGrA/SeGd9DtFtmvLijf3o0ymsVl/TrQA3xkwFyoE3T3aOtXYeMA8gISFBG3CKiN9ZkbKbh97fTEFRKXee35X7LupGw/rBtf66NQ5wY8wtwAhgmNXOyCISgPIPH2P6khQ+SN5Fj/bNmH9zf+IjmtfZ69cowI0xw4EHgPOttcWeLUlExLtZa1n0Qx4zl6VSfKyCP1/SjTvPP4P6wXU7M/tXA9wY8xZwARBujMkFplE16yQE+NgYA7DWWntXLdYpIuIV8g6UMGVhMmu25tM3Moy/julNdJtQR2o5lVkoY3/m8PxaqEVExGtVVlreWJfN3A/TscD0K+O4cXAUwUHGsZrqdEceERFftLOgmAkLNrEuq5BzY8KZdU08nVo2drosBbiIyMlUVlr+tTabOR+mUy/I8NfRvbk2IQLX0LHjFOAiIj9jZ0ExDyRuYm1mIed1a82cUfF0CGvkdFk/oQAXEanm+Fj3nA/TCTaGuaPjuS6hk9f0uqtTgIuIuOQUFvPAgiS+ySzg3Jhw5o7u7XW97uoU4CIS8CorLW+uy2b2h+kEGcOcUfH8pr939rqrU4CLSEA7sdc9Z3RvOnpxr7s6BbiIBKTKSsub3+5k9vI0goxh9qh4rveBXnd1CnARCTi5+4uZmJjEVxkFnBMdztwxvtPrrk4BLiIBw1rLv7/dyawP0gCYdU08Ywf4Vq+7OgW4iASE3P3FTEpM5suMfQyJbsXc0b2JaOH8akp3KMBFxK+VV1Ty6tc7eGLlVoIMPHpNL347INJne93VKcBFxG8l5x5k8qIkNucd4sLYNjx8dS+fHOs+GQW4iPidktIKnvx4C/O/zKJV0xD+/tu+XB7fzi963dUpwEXEr3ydsY9JC5PZWVjM2AGRTLosluaN6jtdVq1QgIuIXzhYUsbs5Wm8/V0OUa0a89bvBzH4jFZOl1WrFOAi4vOObyq878ixOt1U2GkKcBHxWdU3FY5tF8o/b06gd0SY02XVGQW4iPgcay2J3+fx8LJUSkqd21TYaQpwEfEpOYXFTFmUzBfb9pHQuQVzRvcmuk1Tp8tyhAJcRHxCRaXl9W928NiKLRhg5lU9uWFgZ4Ic3FTYaQpwEfF62/Yc5oHEJH7YeYDzu7Xm0Wt6+fwyeE9QgIuI1yotr+SFNdv52ycZNA4J5qnf9OHqMzv63YKcmlKAi4hX2pRzgImJSaTvPsyI3u2ZPrIn4U1DnC7Lq/xqgBtjXgZGAHuttb1cx1oC7wBRwA7gOmvt/torU0QCRfVl8K1DQ3jppgQujmvrdFle6VTm3LwKDD/h2CRgtbU2Bljteiwi4pavM/Zx6dOf89IXWVw/IJKP/3S+wvsX/GoP3Fr7uTEm6oTDVwEXuD5/DfgMmOjJwkQkcATiMnhPqOkYeFtr7S7X57uBk/6KNMaMA8YBREZG1vDlRMRfBeoyeE9w+01Ma601xthfeH4eMA8gISHhpOeJSGAJ9GXwnlDTAN9jjGlvrd1ljGkP7PVkUSLiv6y1vL8xjxlLUyk+VsH9F3fjrgsCbxm8J9Q0wJcANwNzXP9d7LGKRMRvZRcU8eD7m/li2z7O7BTGY2N6E9M21OmyfNapTCN8i6o3LMONMbnANKqC+11jzO1ANnBdbRYpIr6trKKSf36RxdOrtlI/OIgZI3tyw6DOBAfwMnhPOJVZKGNP8tQwD9ciIn6o+oKcS3u2ZcbIXrRr3tDpsvyCVmKKSK04WlbBUx9v5aUvMmkdGsK8G/txSc92TpflVxTgIuJx32YVMjExiax9RYwd0InJl/egWUP/3JfSSQpwEfGYomPlzP0onde/yaZTy0a8ecdAhkSHO12W31KAi4hHrM0sYMKCTeTuL+HWIVFMuLQ7jRsoYmqTvrsi4pbS8kqe/HgrL36+nciWjXln3GAGdGnpdFkBQQEuIjW2dc9h7n93E8l5B7m+fyf+cmWcet11SN9pETltx8oreHFNJs99so2mIfV44Ya+DO/V3umyAo4CXEROy9rMAqYuSmZ7fhEjerdnxsietNJGC45QgIvIKSksKmX28jTe25BLRItGvHJLf4bGtnG6rICmABeRX2StJfH7PB79IJXDR8u56/wzuHdYDI0a6JavTlOAi8hJbc8/wtRFyazNLKRvZBizRsUT266Z02WJiwJcRP7L0bIKnv9sO89/tp2Q+kE8ek0vxvaPJEg3n/IqCnAR+YmvM/Yx9f3NZO0rYmSfDjw4ogdtQnXzKW+kABcRAAqOHOPR5Wks/D6PyJaNef22AZzXrbXTZckvUICLBDhrLe+tz2XWh2kcOVrO3UPP4J4LY7QvpQ9QgIsEsIy9h5myaDPfZhXSP6oFj14TTzftkOMzFOAiAehoWQV//zSDF9Zsp3GDeswdHc+1/TrpTUofowAXCTBfb9/HlIXJ7Cgo5pqzOjL1ih6EayWlT1KAiwSIktIK5n6Uzqtf7yCqVWPeuH0g58ToXt2+TAEuEgA25hzgT+9uJDO/iJsHd2biZbG6a6Af0BUU8WOl5ZU898k2/vHZdtqGhmiHHD+jABfxUxuy9zN5YRJb9xxhdN8Ipo2M076UfkYBLuJnjhwr5/EVW3jtmx20b9aQl29J4MLYtk6XJbXArQA3xtwH3AFYIBm41Vp71BOFicjpsdayImUPM5emsOvQUW4eHMWfL+1O0xD10/xVja+sMaYjMB6Is9aWGGPeBa4HXvVQbSJyirL2FTF9SQprtuYT2y6Uv/2uL30jWzhdltQyd3811wMaGWPKgMbAj+6XJCKnqqS0gn98lsGLazJpUC+Iv4yI46bBnakXHOR0aVIHahzg1to8Y8zjwE6gBFhprV154nnGmHHAOIDIyMiavpyIVGOtZVXaXmYsTSF3fwnXnNWRyZfF0qaZ7hoYSNwZQmkBXAV0AQ4A7xljbrDWvlH9PGvtPGAeQEJCgq15qSICkF1QxIylqXySvpdubZvy9rhBDOrayumyxAHuDKFcBGRZa/MBjDELgbOBN37xX4lIjZSWV/Limu0892kG9YMMD17Rg5vPjqK+hksCljsBvhMYZIxpTNUQyjBgvUeqEpGf2JRzgImJSaTvPswV8e15aEQc7ZpruCTQuTMGvs4YswD4HigHfsA1VCIinlFcWs6TK7fy8ldZtA4N4aWbErg4TnO6pYpbs1CstdOAaR6qRUSq+SpjH5MWJpFTWMJvB0Yy6bJYraSUn9AMfxEvc7C4jEeXp/Lu+ly6hDfRm5RyUgpwES/yYfIu/rIkhcKiUv7ngjO4d5i2NpOTU4CLeIG9h47y0OLNrEjZQ88OzXjllv706tjc6bLEyynARRxkreXd9Tk88kEapeWVTBwey+/P7aKVlHJKFOAiDskuKGLywmS+3l7AwC4tmTO6N13CmzhdlvgQBbhIHSuvqOTlr7J48uOt1A8KYtY18VzfXxsKy+lTgIvUodQfDzFpYRJJuQe5qEdbHrm6lxbkSI0pwEXqwNGyCp77ZBsvrskkrHF9/vbbs7givj3GqNctNacAF6llazMLmLIomcz8Ikb3jeDBK3rQokkDp8sSP6AAF6klB4vLmP1hGm9/l0Onlo14/bYBnNettdNliR9RgIvUgrWZBfzx7Y3kHznGned35Y/DutGogRbkiGcpwEU8qLyikmdXb+O5TzOIatWE9/93CPERWpAjtUMBLuIhW/ccZsKCJDblHGBMvwhmjOxJE20oLLVIP10ibiqrqOSFz7bz7CfbCG1Yn+fGnsWVfTo4XZYEAAW4iBs25x1kwoIk0nYd4so+HZh+ZRytmoY4XZYECAW4SA0cLavg2dXbePHzTFo1aaCNFsQRCnCR07Qhu5AHFiSxPb+I6xIimHpFHM0baaMFqXsKcJFTVFJawRMrtzD/qyw6NNe8bnGeAlzkFKzfUciEBUlk7SvixkGdmXhZLE01w0Qcpp9AkV9QUlrB4yu38PJXWXQMa8S/7xjI2dHhTpclAijARU7qxF73pMtiNa9bvIp+GkVOUFxazmMrtvDq1zvU6xavpgAXqWZtZgETE5PILijmpsGdeWC4xrrFe+knUwQoOlbO3I/Sef2bbDq3aszb4wYxqGsrp8sS+UVuBbgxJgz4J9ALsMBt1tpvPFCXSJ35fGs+UxYlk3eghFuHRDHh0u40bqC+jXg/d39KnwE+staOMcY0ABp7oCaROlFYVMojy1JZ+EMeXcOb8M64wQzo0tLpskROWY0D3BjTHDgPuAXAWlsKlHqmLJHaY61l8cYfmbkslUMlZdxzYTR3D42mYX3dr1t8izs98C5APvCKMaYPsAG411pbVP0kY8w4YBxAZGSkGy8n4r6cwmIefH8za7bmc2anMOaMjie2XTOnyxKpkSA3/m09oC/wvLX2LKAImHTiSdbaedbaBGttQuvWWnYszqistLz29Q4ueepzvttRyLQr40j8n7MV3uLT3OmB5wK51tp1rscL+JkAF3FaTmExExZsYm1mIed1a83sUfF0DGvkdFkibqtxgFtrdxtjcowx3a21W4BhQKrnShNxj7WWf3+7k1kfpGGMYe7oeK5L6IQxxunSRDzC3Vko9wBvumagZAK3ul+SiPt+PFDCxMQkvti2jyHRrZg7ujcRLTRJSvyLWwFurd0IJHimFBH3VVZa3vpuJ7OXp1NpLQ9f3YsbBkaq1y1+SasVxG9kFxQxKTGZbzILOPuMVswZ1ZvIVup1i/9SgIvPq3DNMHlsxRaCgwyzR8VzfX+NdYv/U4CLT8vYe4QHFmzi+50HGNq9NbNGxdO+uWaYSGBQgItPKq+oZN4XmTy9ahuNGwTz1G/6cPWZHdXrloCiABefk7WviD+9u5Efdh7gsl7tmHlVL1qHhjhdlkidU4CLzzg+r/uRZWnUDzY8O/YsRvbp4HRZIo5RgItP2HvoKBMTk/h0Sz7nxoTz2Jg+tGve0OmyRBylABev92HyLqYsSqa4tIIZI3ty46DOBAVprFtEAS5e69DRMqYvTmHhD3n0jmjOk9edSXSbpk6XJeI1FODilT5N38vURcnsOXyM8cNiuOfCaOoHu3PzTBH/owAXr1JYVMrDy1JZ9EMeMW2asuB3fTkrsoXTZYl4JQW4eAVrLcuSdjF9SQoHS8oYPyyGu4eeQUg97ZIjcjIKcHHc7oNHefD9zaxK20OfiOa8+fuB2mhB5BQowMUxlZWWt7/LYfbyNMoqK5l6eQ9uO6cLwZphInJKFODiiB37ipi0MIm1mYUM6tqSOaN6ExXexOmyRHyKAlzqVFlFJfO/zOLpVVupHxSkOweKuEEBLnVmY84BJiUmkb77MBfHteXhq3ppNaWIGxTgUuuOllXw+IotzP8qi7ahDXnhhn4M79XO6bJEfJ4CXGpVUu4B7ntnI9vzi7hhUCQTh8cS2rC+02WJ+AUFuNSKikrLvM8zeWLlFlqHhvCv2wdwbkxrp8sS8SsKcPG4zPwj/Pm9ql1yLo9vx+xretO8sXrdIp6mABePqay0vPL1Dv76UToN6wfzzPVnMrJPB80wEaklCnDxiOyCIia8l8S3OwoZFtuG2aPiadNMM0xEapPbAW6MCQbWA3nW2hHulyS+pLLS8sa6bGYvT6desOHxa/swuq/2phSpC57ogd8LpAG6eUWAySks5oEFSXyTWcD53VozZ7R2hBepS24FuDEmArgCeBT4k0cqEq93fG/KWR+kYYxh7uh4rkvQakqRuuZuD/xp4AEg9GQnGGPGAeMAIiMj3Xw5cVp2QRFTF23my4x9nBMdztwxvekYpl63iBNqHODGmBHAXmvtBmPMBSc7z1o7D5gHkJCQYGv6euKsY+UVzFuTyd8+zaB+cBAPX92LGwZGqtct4iB3euBDgJHGmMuBhkAzY8wb1tobPFOaeIvPtuxl5tJUMvcVcUV8ex4aEad7mIh4gRoHuLV2MjAZwNUD/7PC27/sLChm5rJUVqXtoUt4E169tT8XdG/jdFki4qJ54PJfKiqr3qR8ZFkqwUGGicNjue2cKG1vJuJlPBLg1trPgM888bXEWd/v3M+0xSkk5x3knOhwHr+2j4ZLRLyUeuACVO0GP/fDdN5Zn0PbZiE8O/YsruzdXm9SingxBXiAs9by3oZcZi9P4/DRcu48ryv3DIuhaYh+NES8nf4vDWBb9xzmwUWb+XZHIf2jWvDI1fF0b3fSKf0i4mUU4AGopLSCZz/ZxkufZ9K0YT3+Oro3Y/pFEKTd4EV8igI8wHySvoe/LE4hd38J1/aLYPLlPWjZpIHTZYlIDSjAA8SugyXMWJLKRym7iWnTlHfGDWJg11ZOlyUiblCA+7nyikpe+yabJ1duocJaJlzand+f25UG9YKcLk1E3KQA92Obcg4wZVEyKT8e4oLurXn4ql50atnY6bJExEMU4H7oaFkFf/1oC698nUXrpiH8/bd9uTy+neZ0i/gZBbif2brnMOPf+oH03Ye5cVBnJgzvTrOG2lBYxB8pwP2EtZY31mbzyAdphDasxyu39meobjwl4tcU4H6g4MgxJiYmsSptLxd0b81jY/rQOjTE6bJEpJYpwH2YtZbE7/P+swx+2pVx3HJ2lMa6RQKEAtxHVV8G3zcyjFmj4oltp32lRQKJAtzHFJeW88zqbcz/IoumDesxd3Q81/brpGXwIgFIAe4jrLWsTN3DzKWp5B0o4bqECCZdpmXwIoFMAe4DcgqLmb4khdXpe4ltF8qCuwaTENXS6bJExGEKcC9WXlHJ/C+zeGrVVoKMYerlPbhlSBT1g7UMXkQU4F4r9cdDTExMIjnvIJfEtWX6yJ50CGvkdFki4kUU4F7mWHkFf/skg+c/205Y4/r843d9uayXlsGLyH9TgHuRDdn7eWDBJrbnFzG6bwQPjehBWGO9SSkiP08B7gVKyyt5etVWXliznfbNG/HabQM4v1trp8sSES+nAHfYlt2Hue+djaTuOsRvEjrx0JVx2lBYRE5JjZPCGNMJeB1oC1hgnrX2GU8V5u8qKy3zv8zisRVbaNaoHi/dlMDFcW2dLktEfIg7Xb1y4H5r7ffGmFBggzHmY2ttqodq81u5+4u5/91NrMsq5JK4tsweFU+rprr5lIicnhoHuLV2F7DL9flhY0wa0BFQgJ+EtZYFG3KZsbTqW/TYmKrd4DXDRERqwiODrcaYKOAsYJ0nvp4/ysw/wrQlKXyxbR8DurTkiWv7aHszEXGL2wFujGkKJAJ/tNYe+pnnxwHjACIjI919OZ9ztKyCf3yawQtrMgmpF8SMkT25YVBngnXzKRFxk1sBboypT1V4v2mtXfhz51hr5wHzABISEqw7r+dr1mzN5y+LN5NdUMxVZ3Zg6hU9aBPa0OmyRMRPuDMLxQDzgTRr7ZOeK8n3HSwuY+ayVBK/z6VreBPevGMgQ6LDnS5LRPyMOz3wIcCNQLIxZqPr2BRr7XK3q/Jhq1L3MGVRMgVFpfxhaDT3DIsmpF6w02WJiB9yZxbKl4AGcl0OFJcyc2kqC3/II7ZdKPNv7k98RHOnyxIRP6Ylfx6wMmU3U9/fzP6iUsYPi+EPQ6NpUE+3fBWR2qUAd0PBkWNMW5LCsqRdxLVvxqu39qdnB/W6RaRuKMBrwFrL0qRdTF+SwuGjZfz5km7cef4Z2mhBROqUAvw07T18lAcXbWZl6h76RDTnsWsH0a1tqNNliUgAUoCfhmVJP/Lg+5spLq1g8mWx3H5OF+qp1y0iDlGAn4L9RaU8tHgzy5J20SeiOU9c14foNup1i4izFOC/YlXqHiYtTOZgSSkTLu3Oned1Va9bRLyCAvwkDh0tY+bSVBZsyCW2XSiv3zaAuA7NnC5LROQ/FOA/49P0vUxZlMzew8f4w9Boxg+L0bxuEfE6CvBqCotKeXhZKot+yCOmTVOev6EfZ3YKc7osEZGfpQCnal73Mte87oMlZYwfFsPdQ8/QPUxExKsFfIBnFxTx0OIUPt+aT3zH5rxxx0B6tNdYt4h4v4AN8GPlFcxbk8lzn2bQIDiIaVfGceOgzpphIiI+IyAD/NusQiYvTGJ7fhFXxLfnoRFxtGuujRZExLcEVIAfLCljzofpvPXtTjqGNeKVW/ozNLaN02WJiNRIQAS4tZblybuZvjSFgiPH+P25Xbjv4m40bhAQzRcRP+X3Cbb30FGmLNrMqrQ99OrYjFdu6U+vjrrlq4j4Pr8O8KWbfmTqomSOlVcy5fJYbhuim0+JiP/wywA/cqycaYtTSPw+l76RYTxx3Zl0CW/idFkiIh7ldwH+5bZ9TExMYtfBEsYPi2H8hdHqdYuIX/KbAD9YUsasD9J4Z30OXcOb8N5dg+nXuaXTZYmI1Bq/CPDVaXuYsiiZ/MPHuOv8M/jjRTE0rK9l8CLi33w6wPcXlTLTdfOp7m1DeemmBHpHhDldlohInfDZAP8weRcPLd7MgeIy7h0Ww91Do3XLVxEJKG4FuDFmOPAMEAz801o7xyNV/YKDJWVMWZTMB0m76NmhGa/fNlAbLYhIQKpxgBtjgoG/AxcDucB3xpgl1tpUTxVX3d7DR3njm2z+/W0OB4qrtjcbd15X6muGiYgEKHd64AOADGttJoAx5m3gKsDjAf7c6m0890kGZZWVDO3ehvHDYrTRgogEPHcCvCOQU+1xLjDwxJOMMeOAcQCRkZE1eqEOYY24NiGCO87tqgU5IiIutf4mprV2HjAPICEhwdbka4zuF8HofhEerUtExNe5M4CcB3Sq9jjCdUxEROqAOwH+HRBjjOlijGkAXA8s8UxZIiLya2o8hGKtLTfG/AFYQdU0wpettSkeq0xERH6RW2Pg1trlwHIP1SIiIqdBk6hFRHyUAlxExEcpwEVEfJQCXETERxlra7S2pmYvZkw+kF3Dfx4O7PNgOd4ukNobSG2FwGpvILUVaq+9na21rU88WKcB7g5jzHprbYLTddSVQGpvILUVAqu9gdRWqPv2aghFRMRHKcBFRHyULwX4PKcLqGOB1N5AaisEVnsDqa1Qx+31mTFwERH5KV/qgYuISDUKcBERH+UTAW6MGW6M2WKMyTDGTHK6HncZYzoZYz41xqQaY1KMMfe6jrc0xnxsjNnm+m8L13FjjHnW1f4kY0xfZ1tw+owxwcaYH4wxy1yPuxhj1rna9I7rlsQYY0JcjzNcz0c5WngNGGPCjDELjDHpxpg0Y8xgP7+297l+jjcbY94yxjT0p+trjHnZGLPXGLO52rHTvp7GmJtd528zxtzsidq8PsCrbZ58GRAHjDXGxDlbldvKgfuttXHAIOBuV5smAauttTHAatdjqGp7jOtjHPB83ZfstnuBtGqP5wJPWWujgf3A7a7jtwP7Xcefcp3na54BPrLWxgJ9qGq3X15bY0xHYDyQYK3tRdWtpa/Hv67vq8DwE46d1vU0xrQEplG17eQAYNrx0HeLtdarP4DBwIpqjycDk52uy8NtXAxcDGwB2ruOtQe2uD5/ERhb7fz/nOcLH1Tt1rQauBBYBhiqVqvVO/EaU3V/+cGuz+u5zjNOt+E02tocyDqxZj++tsf3xm3pul7LgEv97foCUcDmml5PYCzwYrXjPzmvph9e3wPn5zdP7uhQLR7n+hPyLGAd0NZau8v11G6gretzX/8ePA08AFS6HrcCDlhry12Pq7fnP211PX/Qdb6v6ALkA6+4hoz+aYxpgp9eW2ttHvA4sBPYRdX12oD/Xt/jTvd61sp19oUA91vGmKZAIvBHa+2h6s/Zql/TPj/H0xgzAthrrd3gdC11pB7QF3jeWnsWUMT//3kN+M+1BXANA1xF1S+uDkAT/nu4wa85eT19IcD9cvNkY0x9qsL7TWvtQtfhPcaY9q7n2wN7Xcd9+XswBBhpjNkBvE3VMMozQJgx5viOUNXb85+2up5vDhTUZcFuygVyrbXrXI8XUBXo/nhtAS4Csqy1+dbaMmAhVdfcX6/vcad7PWvlOvtCgPvd5snGGAPMB9KstU9We2oJcPzd6ZupGhs/fvwm1zvcg4CD1f5882rW2snW2ghrbRRV1+4Ta+3vgE+BMa7TTmzr8e/BGNf5PtNbtdbuBnKMMd1dh4YBqfjhtXXZCQwyxjR2/Vwfb69fXt9qTvd6rgAuMca0cP3VconrmHucfnPgFN9AuBzYCmwHpjpdjwfacw5Vf3IlARtdH5dTNRa4GtgGrAJaus43VM3E2Q4kU/WOv+PtqEG7LwCWuT7vCnwLZADvASGu4w1djzNcz3d1uu4atPNMYL3r+r4PtPDnawvMANKBzcC/gBB/ur7AW1SN75dR9RfW7TW5nsBtrnZnALd6ojYtpRcR8VG+MIQiIiI/QwEuIuKjFOAiIj5KAS4i4qMU4CIiPkoBLiLioxTgIiI+6v8A36dzueWoM4QAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(vanilla_t2r)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 362,
   "id": "cccf7e6e",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/yashbonde/Desktop/AI/ks2labs/RNN-sim/t2rmodel.py:210: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs!\n",
      "  assert x.shape[1] == 1, f\"During inference only one token is allowed got: {x.shape}\"\n"
     ]
    }
   ],
   "source": [
    "# Export the model\n",
    "\n",
    "# since this is a very large model we cannot export this as a single ONNX graph\n",
    "# we pass argument use_external_data_format=True in torch.onnx.export(), last arg\n",
    "# this creates a weight blob for different layers. we create a folder for this\n",
    "# so everything is consolidated\n",
    "import os\n",
    "export_folder = \"./data/onnxrnn\"\n",
    "export_onnx = export_folder + \"/model.onnx\"\n",
    "os.makedirs(export_folder, exist_ok=True)\n",
    "\n",
    "# unlike our MNIST example where the dimensionality of input was fixed to 784\n",
    "# BERT and transformer models can have 2D dynamic input/output\n",
    "dynamic_axes_dict = {\n",
    "  0:'batch_size',\n",
    "}\n",
    "\n",
    "# eval mode and \n",
    "model.eval()\n",
    "\n",
    "# since the input is fully dynamic, tiny sequence will work for trace\n",
    "sample_input = torch.randint(low = 0, high = tinyconf.vocab_size, size = (1, 1))\n",
    "s, z = model.init_hidden()\n",
    "i = torch.Tensor([0]).long()\n",
    "\n",
    "# export model\n",
    "torch.onnx.export(\n",
    "  model = model,\n",
    "  args = (\n",
    "    sample_input, # input_ids\n",
    "    None,\n",
    "    None,\n",
    "    s,            # s_rnn\n",
    "    z,            # z_rnn\n",
    "    i\n",
    "  ),                         # model input (or a tuple for multiple inputs)\n",
    "  f = export_onnx,           # where to save the model (can be a file or file-like object)\n",
    "  export_params=True,        # store the trained parameter weights inside the model file\n",
    "  opset_version=11,          # the ONNX version to export the model to\n",
    "  do_constant_folding=True,  # whether to execute constant folding for optimization\n",
    "  input_names = [\n",
    "    'input_ids',\n",
    "    *[f's.{i}' for i in range(len(s))],\n",
    "    *[f'z.{i}' for i in range(len(z))],\n",
    "    'i'\n",
    "  ],                         # the model's input names\n",
    "  output_names = [\n",
    "    'logits',\n",
    "    *[f'sout.{i}' for i in range(len(s))],\n",
    "    *[f'zout.{i}' for i in range(len(s))],\n",
    "  ], # the model's output names\n",
    "  dynamic_axes={\n",
    "    'input_ids': dynamic_axes_dict,\n",
    "    **{f's.{i}':dynamic_axes_dict for i in range(len(s))},\n",
    "    **{f'z.{i}':dynamic_axes_dict for i in range(len(z))},\n",
    "    **{f'sout.{i}':dynamic_axes_dict for i in range(len(s))},\n",
    "    **{f'zout.{i}':dynamic_axes_dict for i in range(len(z))},\n",
    "  }, # variable length axes\n",
    "  verbose = False\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 363,
   "id": "c067db9a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# check model: for models >2GB use onnx.checker\n",
    "import onnx\n",
    "onnx.checker.check_model(export_onnx)\n",
    "\n",
    "# next run the model and see\n",
    "import onnxruntime\n",
    "ort_session = onnxruntime.InferenceSession(export_onnx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 364,
   "id": "50a5f2bb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('input_ids', ['batch_size', 1], 'tensor(int64)'),\n",
       " ('s.0', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('s.1', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('s.2', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('s.3', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('s.4', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('s.5', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('s.6', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('s.7', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('s.8', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('s.9', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('s.10', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('s.11', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('z.0', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('z.1', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('z.2', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('z.3', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('z.4', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('z.5', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('z.6', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('z.7', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('z.8', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('z.9', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('z.10', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('z.11', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('i', [1], 'tensor(int64)')]"
      ]
     },
     "execution_count": 364,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[(x.name, x.shape, x.type) for x in ort_session.get_inputs()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 365,
   "id": "03637619",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('logits', ['batch_size', 1, 38], 'tensor(float)'),\n",
       " ('sout.0', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('sout.1', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('sout.2', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('sout.3', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('sout.4', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('sout.5', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('sout.6', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('sout.7', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('sout.8', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('sout.9', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('sout.10', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('sout.11', ['batch_size', 32, 128], 'tensor(float)'),\n",
       " ('zout.0', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('zout.1', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('zout.2', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('zout.3', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('zout.4', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('zout.5', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('zout.6', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('zout.7', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('zout.8', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('zout.9', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('zout.10', ['batch_size', 32, 8], 'tensor(float)'),\n",
       " ('zout.11', ['batch_size', 32, 8], 'tensor(float)')]"
      ]
     },
     "execution_count": 365,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[(x.name, x.shape, x.type) for x in ort_session.get_outputs()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 366,
   "id": "fbe7f834",
   "metadata": {},
   "outputs": [],
   "source": [
    "ort_inputs = {\n",
    "  'input_ids': sample_input.numpy(),\n",
    "  'i': np.ones([1,]).astype(int) * 12\n",
    "}\n",
    "s_rnn, z_rnn = model.init_hidden()\n",
    "for i_, (s, z) in enumerate(zip(s_rnn, z_rnn)):\n",
    "  ort_inputs.update({\n",
    "    f\"s.{i_}\": s.numpy().astype(np.float32),\n",
    "    f\"z.{i_}\": z.numpy().astype(np.float32),\n",
    "  })\n",
    "\n",
    "# pass through the model\n",
    "ort_outs = ort_session.run(None, ort_inputs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 367,
   "id": "11e7d5e1",
   "metadata": {},
   "outputs": [],
   "source": [
    "def onnx_generate(\n",
    "  input_ids,\n",
    "  max_length,\n",
    "  num_return_sequences = 10,\n",
    "  top_k = 10,\n",
    "  do_sample = True\n",
    "):\n",
    "  # if just a sequence, batchify\n",
    "  if len(input_ids.shape) == 1:\n",
    "    input_ids = input_ids.reshape(1, *input_ids.shape)\n",
    "\n",
    "  # since the hidden states for all `num_return_sequences` will be same\n",
    "  # we first run those and then tile\n",
    "  B, S = input_ids.shape\n",
    "  assert B == 1, \"Only 1 sequence at a time can be generated\"\n",
    "  \n",
    "  times = [time()]\n",
    "\n",
    "  # do the forward passes for input sequence\n",
    "  for i in range(S):\n",
    "    # create the dictionary for this input\n",
    "    ort_inputs = {\n",
    "      'input_ids': input_ids[:, i:i+1],\n",
    "      'i': np.ones([1,]).astype(int) * i\n",
    "    }\n",
    "    if i == 0:\n",
    "      s_rnn, z_rnn = model.init_hidden()\n",
    "      for i_, (s, z) in enumerate(zip(s_rnn, z_rnn)):\n",
    "        ort_inputs.update({\n",
    "          f\"s.{i_}\": s.numpy().astype(np.float32),\n",
    "          f\"z.{i_}\": z.numpy().astype(np.float32),\n",
    "        })\n",
    "    else:\n",
    "      ort_inputs.update({f\"s.{i_}\":s for i_,s in enumerate(s_rnn)})\n",
    "      ort_inputs.update({f\"z.{i_}\":z for i_,z in enumerate(z_rnn)})\n",
    "    \n",
    "    # pass through the model\n",
    "    ort_outs = ort_session.run(None, ort_inputs)\n",
    "    logits = ort_outs[0][0, 0]\n",
    "    s_rnn = ort_outs[1:13]\n",
    "    z_rnn = ort_outs[13:]\n",
    "    \n",
    "    times.append(time())\n",
    "\n",
    "  # now we do tile for beam search\n",
    "  new_tokens = logits.argsort()[::-1][:10][:num_return_sequences].reshape(-1, 1)\n",
    "  s_rnn = np.tile(s_rnn, [num_return_sequences, 1, 1])\n",
    "  z_rnn = np.tile(z_rnn, [num_return_sequences, 1, 1])\n",
    "  generated_token = [new_tokens]\n",
    "  \n",
    "  # now we generate for other steps\n",
    "  for i in range(S, max_length - 1, 1):\n",
    "    ort_inputs = {\n",
    "      'input_ids': new_tokens,\n",
    "      'i': np.ones([1,]).astype(int) * i\n",
    "    }\n",
    "    ort_inputs.update({f\"s.{i_}\":s for i_,s in enumerate(s_rnn)})\n",
    "    ort_inputs.update({f\"z.{i_}\":z for i_,z in enumerate(z_rnn)})\n",
    "    \n",
    "    # pass through the model\n",
    "    ort_outs = ort_session.run(None, ort_inputs)\n",
    "    logits = ort_outs[0][0, 0]\n",
    "    s_rnn = ort_outs[1:13]\n",
    "    z_rnn = ort_outs[13:]\n",
    "    \n",
    "    new_tokens = logits.argsort()[::-1][:10][:num_return_sequences].reshape(-1, 1)\n",
    "    generated_token.append(new_tokens)\n",
    "    \n",
    "    times.append(time())\n",
    "    \n",
    "  # now finally tile input_ids and merge with generate tokens\n",
    "  input_ids = np.tile(input_ids, [num_return_sequences, 1])\n",
    "  generated_token = np.array(generated_token)[:, :, 0].T\n",
    "  generated_token = np.hstack([input_ids, generated_token])\n",
    "  # return generated_token\n",
    "  \n",
    "  return times"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 368,
   "id": "3d53b5b7",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 10/10 [01:05<00:00,  6.53s/it]\n"
     ]
    }
   ],
   "source": [
    "# test with ONNX runtime just like with Vanilla\n",
    "sample_inputs = np.random.randint(low = 0, high = vocab_size, size = (10))\n",
    "time_per_seq_onnx_t2r = []\n",
    "n_tests = 10\n",
    "for _ in trange(n_tests):\n",
    "  this_run_times = onnx_generate(\n",
    "    input_ids = sample_inputs,\n",
    "    max_length = 1024,\n",
    "    num_return_sequences = 10,\n",
    "    top_k = 10,\n",
    "    do_sample = True\n",
    "  )\n",
    "  time_per_seq_onnx_t2r.append(this_run_times)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 369,
   "id": "3a7651ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "onnx_t2r = np.array(time_per_seq_onnx_t2r)\n",
    "# for each case subtract the start time of that generation i.e. first token\n",
    "onnx_t2r = onnx_t2r[:, 1:] - onnx_t2r[:, :1]\n",
    "onnx_t2r = np.mean(onnx_t2r, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 370,
   "id": "ab6f6660",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x134dc4910>]"
      ]
     },
     "execution_count": 370,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(onnx_t2r)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 371,
   "id": "dd5ffbcb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([0.30001078, 0.3603044 , 0.42240689, 0.48196082, 0.54125097,\n",
       "        0.6023731 , 0.66296175, 0.71808777, 0.77635245, 0.83531108,\n",
       "        0.89477158, 0.95519314, 1.01546245, 1.07159636, 1.13419592,\n",
       "        1.19410977, 1.25383372, 1.31882656, 1.38073926, 1.43710034,\n",
       "        1.50217981, 1.56583438, 1.62816389, 1.69034131, 1.7536243 ,\n",
       "        1.80904608, 1.8686095 , 1.9296319 , 1.98867092, 2.05364389,\n",
       "        2.12158947, 2.17747838, 2.2417171 , 2.30212214, 2.36518948,\n",
       "        2.42551796, 2.48610356, 2.54596701, 2.60178342, 2.67385237,\n",
       "        2.7381335 , 2.80237994, 2.86764221, 2.93438027, 2.99237921,\n",
       "        3.05558076, 3.11647213, 3.17842669, 3.24511909, 3.31024184,\n",
       "        3.3666657 , 3.43316984, 3.50073555, 3.56904719, 3.63326676,\n",
       "        3.69783058, 3.75435944, 3.81718402, 3.88622403, 3.95263777,\n",
       "        4.01813571, 4.08591025, 4.14504466, 4.21564918, 4.28588283,\n",
       "        4.35968587, 4.42603579, 4.4884665 , 4.55309491, 4.61042697,\n",
       "        4.68080883, 4.74614847, 4.80754242, 4.87065289, 4.93422985,\n",
       "        4.99717016, 5.06745598, 5.1313802 , 5.19557893, 5.26083806,\n",
       "        5.32736878, 5.38999691, 5.45796313, 5.52133729, 5.58717172,\n",
       "        5.65494246, 5.72161069, 5.77992527, 5.84363828, 5.90766242,\n",
       "        5.96902733, 6.0292872 , 6.09106138, 6.1462888 , 6.20708616,\n",
       "        6.27100027, 6.33482368, 6.39998732, 6.47004688, 6.5301888 ]),\n",
       " array([ 0.56671388,  0.67359655,  0.78942873,  0.90299215,  1.01795886,\n",
       "         1.14033697,  1.26314981,  1.37789428,  1.49893751,  1.61863811,\n",
       "         1.74153607,  1.85831563,  1.9710768 ,  2.08303423,  2.20933535,\n",
       "         2.33492794,  2.45753722,  2.5699872 ,  2.68282847,  2.78343313,\n",
       "         2.90104597,  3.03728797,  3.15480113,  3.26841815,  3.38305266,\n",
       "         3.4866617 ,  3.59534445,  3.71095529,  3.82004516,  3.93199563,\n",
       "         4.05742745,  4.1730397 ,  4.29538913,  4.41554096,  4.54044476,\n",
       "         4.65632424,  4.77870173,  4.89409518,  4.99949501,  5.12991142,\n",
       "         5.25270586,  5.37733274,  5.49448187,  5.61682236,  5.72981851,\n",
       "         5.8535291 ,  5.97173789,  6.08711662,  6.21083498,  6.33080153,\n",
       "         6.44273212,  6.56256754,  6.67766445,  6.80322993,  6.92847986,\n",
       "         7.05461242,  7.15795329,  7.27309558,  7.39327693,  7.52126291,\n",
       "         7.63920929,  7.75235434,  7.85563443,  7.96589205,  8.0766067 ,\n",
       "         8.18782921,  8.30923176,  8.43549905,  8.55274069,  8.65201373,\n",
       "         8.76212304,  8.88100386,  8.99744177,  9.11451535,  9.2297307 ,\n",
       "         9.34802833,  9.46985993,  9.5914402 ,  9.70292084,  9.82403152,\n",
       "         9.94086027, 10.04783657, 10.1713438 , 10.29628515, 10.41213396,\n",
       "        10.53081672, 10.64601169, 10.75286644, 10.8641257 , 10.98493938,\n",
       "        11.11366363, 11.23917418, 11.35869994, 11.46962202, 11.58583174,\n",
       "        11.70541499, 11.82434275, 11.94261985, 12.06710079, 12.18951399]))"
      ]
     },
     "execution_count": 371,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "times_onnx_t2r = onnx_t2r[text_lengths - 2] # -1 (for 0-shift), -1 (for bug in above code)\n",
    "times_vanilla_t2r = vanilla_t2r[text_lengths - 2] # -1 (for 0-shift), -1 (for bug in above code)\n",
    "\n",
    "times_onnx_t2r, times_vanilla_t2r"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "79944c36",
   "metadata": {},
   "source": [
    "## Plot Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "aff0552d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "data = json.load(open(\"./times.json\", \"r\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "79823184",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "hftime = data[\"hftime\"]\n",
    "trtime = data[\"trtime\"]\n",
    "time_per_seq_vanilla_gpt = data[\"time_per_seq_vanilla_gpt\"]\n",
    "time_per_seq_onnx_gpt = data[\"time_per_seq_onnx_gpt\"]\n",
    "time_per_seq_onnx_rnn = data[\"time_per_seq_onnx_rnn\"]\n",
    "rnn_163Mn = data[\"rnn_163Mn\"]\n",
    "text_lengths = data[\"text_lengths\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "070d3775",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABJcAAAH/CAYAAADqljx4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOzdd3hcV53/8feZLmlGo94lW7Lce4udHtIrCT0JIZQQYFlg+cFSdtlddtnG7rIsvRNKII0ACSEFQnp1bMcl7rIlq/cyqtPuPb8/zqjYlmK5jsr39Tz3uXfuzJ05MxqNdD9zzvcorTVCCCGEEEIIIYQQQpwMR7IbIIQQQgghhBBCCCGmLwmXhBBCCCGEEEIIIcRJk3BJCCGEEEIIIYQQQpw0CZeEEEIIIYQQQgghxEmTcEkIIYQQQgghhBBCnDQJl4QQQgghhBBCCCHESZNwSQghxJSmlNqtlLok2e04mlLqEqVUQ7LbIUYppXKVUvuUUimJy88qpT6c7HadKKVUmVKqXynlTHZbToVSaoVS6uVTOH7avw5KqceVUu9PdjtOhlLqsFLq8mS3QwghxPQg4ZIQQoikSpw8Di+2UmpozOX3aq2Xaq2fPQvt+Gel1K/O9OOcqOkakJwopdQHlFIvnuLdfBH4udZ66HS0KVm01nVaa7/W2kp2W5RShUqpPyilmpRSWik196jrvUqpu5RSvUqpFqXUZ4av01rvBHqUUjeczGMn63VQSr1bKfWyUmpQKfXsONevUkptTVy/VSm1aqL70lpfo7X+xZlsb6JNx/38krBICCHEmSThkhBCiKRKnDz6tdZ+oA64Ycy+Xye7feLUKaVcZ+ExvMD7gSkXEE5zNvAE8I4Jrv9nYD4wB3gL8Hml1NVjrv818NEz2cAzoAv4BvDVo69QSnmAhzHvs0zgF8DDif1CCCHErCXhkhBCiClt7LftiW/nf6OU+pVSqk8p9YZSaoFS6u+UUm1KqXql1JVjjg0qpX6qlGpWSjUqpf5tvCE2iZPhvwfek+gxtSOx/4NKqb2Jx6pWSk14kqyU+pRSao9SqiTRm+NrSqk6pVSrUuoHY4ZqXaKUalBKfTbR5mal1AcnuM9/By4EvpNo13cS+89TSm1WSoUS6/PepF1rlFLbEs/hN0qp+5VS/zbm+uuVUtuVUj2J3horjnrt/1YptTPxWPcrpXwncOwXlFI7gQGllEsp9UWl1KFEW/Yopd6WuO1i4AfAuYnn2ZPYP+HrOI4NQI/W+uihivOUUq8letY8rJTKGtPGjYl29yildqgxwy/f7Gc/5mf4+TE/w5uUUtcqpQ4opbqUUn8/0c9kzP2co5Takmhbq1Lq64n9c5XpJeRSSg2/JsNLWCl1OHE7x5jXtFMp9cDY53c6aK1btdbfAzZPcJP3A/+qte7WWu8Ffgx8YMz1zwKXKRP+HUMpVa6Uej7xOv9FKfVdleiBc9Tr8B6l1Jajjv1/Sqk/JLZPy+9c4jn/RWv9ANA0ztWXAC7gG1rriNb6W4ACLp3g+Y30PFSJ3nmJdnYrpWqUUtccddv/HO/9qsYZhpv4HbtcTfD5ddRt7wbKgEcSt/l8Yv9blRl63JN4/MUTPI/Fifbekrh8Up8bSqkcpdQfE8d1KaVeUErJ+YgQQswA8mEuhBBiurkBuBvTa2Ab8CfM37Ni4CvAD8fc9udAHKgEVgNXAscMMdNaPwH8B3B/osfUysRVbcD1QDrwQeD/lFJrjj5eKfVPmBPqixPhxleBBcCqxGMXA/805pACIJjYfwfwXaVU5jjt+hLwAvCJRLs+kTjZfBT4FpANfB14VCmVPU67PMDvE69DFnAv8LYx168G7sL0LMlOvHZ/OCoIeDdwNVAOrEg8z8keewtwHZChtY4DhzBhWRD4F+BXSqnCRCjxMeCVxPPMSBx/vNdxrOXA/nH23w58CCjEvBe+lWh/MeZ1/LfEa/O3wG+VUrmJ4473sy8AfGPa9GPgNmBt4jn+o1KqfIK2Dvsm8E2tdTowD3jg6BtorV8Z07MvE9iE+TkCfBK4CbgYKAK6ge+O90DK1C/qeZPl1uO0dbz7zMS8rmPDjB3A0jHtbwRiwMIJ7uYe4DXMe+ifgfdNcLtHgIVKqflj9t2aOB5O0+/cJCwFdmqt9Zh9OxnznI9jA+Z9mgP8N/BTpZQac/2479c38yafX2Nv8z6O7Bn630qpBZj30qeBXOAxTPh0RC+sxPv+T8Antdb3nsrnBvBZoCHxePmYUGzsaymEEGKaknBJCCHEdPOC1vpPibDiN5iTlK9qrWPAfcBcpVSGUiofuBb4tNZ6QGvdBvwfcPNkH0hr/ajW+pA2ngP+jAkOhilleptcCbxFa92eOFH8CPD/tNZdWus+zInf2MeNAV/RWse01o8B/Ux88n2064AqrfXdWuu41vpeYB8mdDvaRkwvi28lHut3mBP5YR8Bfqi13qS1thK1YSKJ44Z9S2vdpLXuwpzgrzrBY+uHayBprX+TuC9ba30/UAWcM96TnOTrOFYG0DfO/ru11ru01gPAPwLvVqb32m3AY1rrxxLteRLYgnnPTOZnHwP+fcz7LgcTFPVprXcDe4BjTvKPEgMqlVI5Wut+rfWrx7n9txLP8UuJyx8DvqS1btBaRzDhzDvVOMMQE/WLMt5kuefoYybBn1iHxuwLAYGjbteH+fkcQSlVBqwH/klrHdVavwj8YbwH0loPYoajDfecmQ8swoQaZ/p3biw/Rz5fGP85T6RWa/3jRB2pX2BCpPwx10/0fj0T3gM8qrV+MvE+/hqQAoztCXkh5mdyu9b6j4l9p/K5EcM85zmJn8ULRwV1QgghpikJl4QQQkw3rWO2h4AOPVrwd7iQsx9TA8YNNA/3zsB8w5432QdSSl2jlHo1MXyjBxM85Iy5SQbmROs/tdbDJ5y5QCqwdczjPpHYP6wzEY4NG2T0RP14ioDao/bVYnpkjHfbxqNO3urHbM8BPju2BwtQmjhuWMsE7ZzMsWMfC6XU7WOG0vQAyzjy9RxrMq/jWN2Mf4I/tg21mPdETqL97zqq/RdgTnwn87PvHOd9d/R783g/0zswvW32KTO88fqJbqjMsLxLgFu11nZi9xzg92PavxewODKsOJP6E+v0MfvSOTbkCwA94xxfBHQlgqNh9ePcbtg9JMIlTK+lhxLHnunfubH6OfL5wvjPeSIjv09jnvfYdkz0fj0TjvgsSbyv6jnys+RjwMv6yEkVTuVz43+Ag8CflRlu+sXT9FyEEEIkmYRLQgghZqp6zLfpOWN6Z6RrrScavnLEt+eJIR6/xXybn58YqvUYpr7KsG7M0KmfKaXOT+zrwAQLS8c8bjAxrOlkHP2tfhPm5G6sMqBxnGObgeKjht2Ujtmux/S+GduDJTXRG+p4JnPsSNuVUnMwQ8c+AWQnXs9djL6eRz/PE30dd2KCmqONfb5lmJ4THYn2331U+9O01l+d5M/+lGmtq7TWt2ACz/8CHlRKpR19O6XUhcC/AjdqrXvHXFUPXHPUc/BpMxTt6PsoU0fWbjp6ee9JtL8b8x4b20NrJbB7zOMWAx7GH7LYDGQppVLH7Csd53bDngRylZmd7RZGh8Sd7t+5N7MbWHHU79QKxjznUzTR+3UAE6ABkOjNNDY8m0zvnzf9LEk8p1KO/Cz5GFCmlPq/MftO+nMj0bPvs1rrCuCtwGeUUpdNou1CCCGmOAmXhBBCzEha62bMUKb/VUqlK1P8eJ5S6uIJDmnFDKkb/tvoAbxAOxBXpvDulUcflPhG/73A75RS5yS+/f8xpkZPHpgTbKXUVSf5VFqBijGXHwMWKKVuVYlCx8AS4I/jHPsKpifLJxK3vZEjh6H9GPiYUmqDMtKUUtcppSYzxOdEj03DnNy2gymYjem5NPZ5lgzXezmJ1/E1ICMRZox1m1JqSSLA+ArwYKLH0a+AG5RSVymlnEopnzJFk0uY5M/+VCmlblNK5Saea09it33UbUoxtZhu11ofOOoufgD8eyK4QymVm/gZHyMxLM7/JsuEMzMqU4x5uJ6OV40p6g78EvgHpVSmUmoRcCemxtewi4GnE8P2jm5TLWYo4j8rpTxKqXMZf3jn8O1jmKGw/4Opk/VkYv9p/Z0bfj9ghpQ6Eu8Nd+LqZzG/U59Spoj4JxL7nz6ZxxrHRO/XA4Av8TvmBv6B0Z8JHPv5NZ6jP0seAK5TSl2WuM/PYgL5l8fcpg9TO+kipdTw7Hkn/bmhTCHwykSQFcK8lvZxDhNCCDENSLgkhBBiJrsdExTswfQyepDEsKdx/Cax7lRKvZ6o2/IpzAlYN2YYzkT1YJ7EFOF9RJnit1/ADP14VSnVC/yFk6vvAqbo8zuVmV3qW1rrTkxvqc8CncDngeu11h3jtCsKvB0z/KoHU2foj5gTSLTWWzBhwHcSz/EgR870NaETPVZrvQf4X0zg1YopwP3SmJs8jen90aKUGn4uk34dE8/154nnONbdif0tmALcn0rcvh64EVNQuB3TG+NzgONEfvan6Gpgt1KqH/Nzvlkn6lONcRlmmNuDY3oZDfeS+WaiXX9WSvUBr2IKRp9uQ4wOgdvH6DBAgC9jCrXXAs8B/6NNgelh78WEYBN5L3Au5r38b8D9JN6fE7gHuBz4zVHD3E7n79z7MM/x+5iaQ0OYQGX4fXYT5rOlB/N7f1Ni/+kw0fs1BHwc+AmmZ9EApjD2sCM+vya47//EBIE9Sqm/1Vrvx/y+fBvTO+oGTMHvI56L1roHuAK4Rin1r6fyuQHMx/xs+jGfBd/TWj8zyWOFEEJMYUpq6AkhhBCzh1JqE/ADrfXPkt2W002Zmd5eAFaPE9KIs0yZ6el/qLU+9wSOuR/Yp7X+8plr2dSklHoW+JXW+ifJbosQQghxoqTnkhBCCDGDKaUuVkoVJIbFvR9TH+aJ4x03HWmt27XWiyRYmhq01juPFywppdYnhqs6lFJXY3qTPXRWGiiEEEKI00bCJSGEEGJmWwjswAzh+SzwzkQ9KnEWKKUeV+MX0P77ZLdtiijA1DHqB74F/JXWeltSWySEEEKIEybD4oQQQgghhBBCCCHESZOeS0IIIYQQQgghhBDipEm4JIQQQgghhBBCCCFOmivZDTgTcnJy9Ny5c5PdDCGEEEIIIYQQQogZY+vWrR1a69yj98/IcGnu3Lls2bIl2c0QQgghhBBCCCGEmDGUUrXj7ZdhcUIIIYQQQgghhBDipEm4JIQQQgghhBBCCCFOmoRLQgghhBBCCCGEEOKkSbgkhBBCCCGEEEIIIU6ahEtCCCGEEEIIIYQQ4qRJuCSEEEIIIYQQQgghTpqES0IIIYQQQgghhBDipEm4JIQQQgghhBBCCCFOmoRLQgghhBBCCCGEEOKkSbgkhBBCCCGEEEIIIU6ahEtCCCGEEEIIIYQQ4qTNqHBJKXWDUupHoVAo2U0RQgghhBBCCCGEmBVmVLiktX5Ea/2RYDCY7KYIIYQQQgghhBBCzAozKlwSQgghhBBCCCGEEGeXhEtCCCGEEEIIIYQQ4qRJuCSEEEIIIYQQQgghTpqES0IIIc4YrTVbDnexq1EmWhBCCCGEEGKmciW7AUIIIWae7oEov9vWyH2v1VHV1s91Kwr57q1rkt0sIYQQQgghxBkg4ZIQQojTQmvNppou7n2tjsd3tRCN26wszeC/3rGc61cUJbt5QgghhBBCiDNEwiUhhBCnpLM/wu9eb+Te1+qo7hgg4HVx8/pSbl5fxpKi9GQ3TwghhBBCCHGGSbgkhBDihGmteeVQJ/e8VsefdrcQszRr52TytbdUct3yQlI8zmQ3UQghhBBCCHGWSLgkhBBi0vojcX7/egO/eKWWg239BFPc3LZxDrecU8aC/ECymyeEEEIIIYRIAgmXhBBCHFdNxwC/ePkwv93aQF8kzvLiIF9710quX1GIzy29lIQQQgghhJjNJFwSQggxLtvWPHegnZ+/fJjnDrTjdiquXV7I+8+by+rSDJRSyW6iEEIIIYQQYgqQcEkIIcQResMxfrOlgbtfOczhzkFyA14+ffl8bt1QRl7Al+zmCSGEEEIIIaYYCZeEEGIWCccs2vsitPVFaO8L09YXoa03QltfeGR/dfsAQzGLtXMy+cyVC7l6aQEelyPZTRdCCCGEEEJMURIuCSHEDLejvofvP3uIV6o7CQ3FjrneoSDH7yUv3Ut+uo/1c7N459oSlhUHk9BaIYQQQgghxHQj4ZIQQsxAWmtere7ie88e5IWqDtJ9Lq5bUURxho/cgJe8QGKd7iU7zYvTIfWThBBCCCGEECdHwiUhhJhBtNY8s7+N7z5ziK213eT4vXzxmkW8d0MZAZ872c0TQgghhBBCzEASLgkhxAxg2ZrH3mjme88eYm9zL8UZKfzrjUt517pSfG5nspsnhBBCCCGEmMEkXBJCiGksGrd5aFsj33/uEDUdA1TkpvG1d63kxlVFuJ1ShFtMb5Zl0908QE5JINlNEUIIIYQQb0LCJSGEmIbquwa5f3M9D2ypp60vwrLidL7/3jVcubRA6ieJaSsajtNa00vTwR6aD4ZorQkRj9p86GsXkOL3JLt5QgghhBBiAhIuCSHENBGN2zy5p5X7NtfxQlUHDgWXLMzj9nPncPGCXJSSUElML4O9UZoTQVLTwR46GvrRtkYpyC7xs/j8IgrnBXHJ0E4hhBBCiClNwiUhhJjiDrX3c//men67tYHOgSjFGSn8v8sX8O71JRQGU5LdPCEmLToUp2FfN7V7Omnc302obQgAp9tBQXk6a6+eQ+G8IAUVQTwp8i+KEEIIIcR0If+5CSHEFBSOWTz2RjP3ba7ntZouXA7F5YvzufmcUi6cnytD38S0oLWms7Gfut1d1O7qpOVQCNvWuH1OihdksvSCYgorg+SWBXC6pEaYEEIIIcR0JeGSEEJMEXHL5uVDnfxxZxNP7GqhNxxnbnYqX7h6Ee9cW0JuwJvsJgpxXJHBGPV7u6nd3Und7k4GQ1HADHNbdUUpZUuzKZgXxCkF54UQQgghZgwJl4QQIoksW7P5cBeP7DCBUudAlIDXxRVL83nn2hLOrciWWkpiytK2pqdtkLbDvbTW9tF2uJe22j60rfGmuihZlMWcZVmULckmLUPCUSGEEEKImUrCJSGEOMu01myr7+GRHU089kYzrb0RUtxOLl+Sz/UrCrl4QS4+KWAsphitNX1dYdoO99FW20tbbS/ttX1EwxYALq+T3FI/a64qY87SbPLL03FI7yQhhBBCiFlBwiUhhDhLDncMcN/meh7Z0URjzxAel4O3LMzl+hVFXLY4j1SPfCSLqSMWsWg93EvLoRAtNSHaDvcy1BcDwOFU5JT4WXBOAXlzA+TNSSezMA2H1AITQgghhJiV5ExGCCHOIK01mw9385MXqnlybytOpbhwfg6fuWIBVyzNJ93nTnYThQCgrytMy6EQzdUhWg6F6GjoR9sagMyCVOYsyyZvTjp5c9PJKfbjdEuvJCGEEEIIYUi4JIQQZ0DMsnl8Vws/eaGanQ0hMlLd/PUlldx+7hzy0n3Jbp4QDPREOLi1jZbqEC3VIfq7I4AZ3pY/N521V8+hoCJIfnk6vjQJQYUQQgghxMSmfLiklLoJuA5IB36qtf5zclskhBAT6w3HuO+1On7+0mGaQmEqctL4t5uW8Y41JaR4pI6SSL6W6hA7n2ng0NY2bFsTyPJRWJlBQUWQwnlBsovTpFaSEEIIIYQ4IUkJl5RSdwHXA21a62Vj9l8NfBNwAj/RWn9Va/0Q8JBSKhP4GiDhkhBiyqnvGuRnLx3m/s11DEQtNlZk8ZUbl3HpojypQyOSzorbHHq9jR1PN9B2uBdPiovll5aw7KJiMvJSk908IYQQQggxzSWr59LPge8AvxzeoZRyAt8FrgAagM1KqT9orfckbvIPieuFEGJKsG3Niwc7+PWmWp7c04pDKa5fUcgdF1SwvCSY7OYJwWBvlN0vNLLr+UYGQ1Ey8lO56OYFLNxYgMc35TsvCyGEEEKIaSIp/1lqrZ9XSs09avc5wEGtdTWAUuo+4Eal1F7gq8DjWuvXJ7pPpdRHgI8AlJWVnZF2CyEEQGd/hN9sbeCeTXXUdQ2SlebhIxfN4/3nzaEwmJLs5glBe10fO5+u58CWVuy4pmxpFituL6VscRZKetIJIYQQQojTbCp9bVkM1I+53ABsAD4JXA4ElVKVWusfjHew1vpHwI8A1q1bp89wW4UQs4zWmk01Xfx6Ux1P7GomZmnOKc/is1cu4OplBXhdUk9JJF/zoRCvPVJNw75uXF4nS88vYvlbSsgsSEt204QQQgghxAw2lcKlcWmtvwV8K9ntEELMTqHBGL99vYFfb6rlUPsA6T4Xt22cw63nlDE/P5Ds5gkBQFttL5v+UEPd7k5SAm7Oe3slSy4oxJsqs7wJIYQQQogzbyqFS41A6ZjLJYl9Qghx1u1p6uVnL9Xwhx1NROI2q8sy+J93ruD6FUUy65uYMjoa+nntkWpqdnTgTXNx7tvmsfySEtxeeY8KIYQQQoizZyqFS5uB+UqpckyodDNwa3KbJISYTSxb8/S+Nu56sYZXqjtJcTt5x9oS3ruhjKVFUqBbTB1dzQNs/mMNB7e24fE5OeeGclZeWoonZSr9WRdCCCGEELNFUv4LVUrdC1wC5CilGoAva61/qpT6BPAnwAncpbXefYL3ewNwQ2Vl5elushBiBuuPxHlwSz0/e/kwtZ2DFAV9/N01i7h5fRlBGVYkppBQ+yCb/3iYA6+14PQ4WXvNHFZdXoYvTd6nQgghhBAieZTWM6/29bp16/SWLVuS3QwhxBRX3zXIL14+zP2b6+mLxFlTlsEdF1Rw1dJ8XE5HspsnZjmtNYO9UTob++lo6KftcB/V29txOBXLLylhzZVlpAQ8yW6mEEIIIYSYRZRSW7XW647eL/3nhRCzitaaLbXd3PViDX/a3YJSimuXF/Kh8+eyuiwz2c0TU1x0KE536yAOh0I5VGINDqdCKWXWI/sVTpcDhytxWakJ79eK2XS1DIwESZ0N/XQ29jPUFxu5TVqGl2UXF7P26jmkBb1n4+kKIYQQQggxKRIuCSFmhaGoxR92NPKLl2vZ09xLMMXNRy+ex+3nzqEwmJLs5okpzorb7Hqukc2P1hAZjJ/UfThcCqfTccwaoK8zjG2bnsROl4OsojTmLs8hu9hPTomf7GI/Pr8MfRNCCCGEEFOThEtCiBmtrnOQu189zANbGggNxVhUEODf37aMt60uJtUjH4HizWmtOfR6O688dIje9iFKF2ey9KJilFJoW2PbGp1YbFtjWxqtwbY0tmWPrK34mHXcxrLGrC3NvLV5IyFSRl4KDhmWKYQQQgghphE5sxJCzDi2rXm+qp1fvlLLM/vbcCjF1csKuH3jHM4pz3rT4UlCDGs+FOLl31bRUt1LVlEaN3xyJWVLs5PdLCGEEEIIIaacGRUuyWxxQsxuoaEYD25t4O5XDnO4c5Acv5dPXjqfW88poyDoS3bzxDTR0zbIq78/xKFt7aQGPbzlfYtYdG4hDoeEkkIIIYQQQoxHZosTQkxr9V2DPF/VznP723mhqoOhmMXaOZncfu4crllWiMclw4vE5IT7Y2x+rIZdzzXicDlYc2UZqy4vw+11JrtpQgghhBBCTAkyW5wQYkYYilq8WtPJ8wfaee5AO9XtAwAUZ6TwjrXF3Ly+jGXFwSS3UkwXWms6Gvqp2dHBjqfqiYXjLL6giHOuL5cZ2YQQQgghhJgkCZeEEFOa1pqqtv6RMGlTTRfRuI3X5WBjRTa3bZjDxQtzqchJk1pKYlIigzHq93ZTt7uT2t2dDIaiAMxZls25b59HdpE/yS0UQgghhBBiepFwSQgxZe1p6uUfH97F1tpuAObn+bl94xwuWpDLOeVZ+NwyXEkc33DvpLrdndTu6qSluhdta7ypLkoXZ1G2NJuypVnSU0kIIYQQQoiTJOGSEGLK6Y/E+b8nD/Dzlw+TkeLmX966lCuW5FOUkZLspokpzLJsBroj9HWFzdIZJtQ2RP2+rpHeSTmlftZcWUbZsmwKytNxOKUmlxBCCCGEEKdKwiUhxJShtebxXS185ZE9tPaFueWcMj5/1UIyUj3JbpqYQkLtQ9Tv7aKvc4i+rgh9nSZMGghF4Kg5KlLTPRTNz5DeSUIIIYQQQpxBMypcUkrdANxQWVmZ7KYIIU5QbecA//Twbp470M6SwnS+d9sa1pRlJrtZYooYCEU4uKWNqi2ttNb0AuBwKvyZXgLZPkoXZeLP9hHIGl38WV5cMnRSCCGEEEKIM05prY9/q2lm3bp1esuWLcluhhBiEiJxix8+V813nzmI2+ngM1cs4PZz5+CS4UqzXmQwxqFt7VRtbqVxfzdam2Ft89fnM291LoHsFBwOKeIuhBBCCCHE2aKU2qq1Xnf0/hnVc0kIMb28dLCDf3xoF9UdA1y3opB/vG4JBUFfspslkigWtTi8s4Oqza3U7u7EjmuCuSmsvXYuC9bnk1mQluwmCiGEEEIIIY4i4ZIQ4qzb39LHt56q4tE3mpmTncovP3QOFy3ITXazRJJEw3Fqd3VSs6ODwzs7iEUs0oIell9cwvz1+eTNCaCU9FASQgghhBBiqpJwSQhx1uxs6OE7Tx/kz3taSfM4+fTl8/nYxfPwSV2cWWewN8rhnR1Ub2+nfl8XdlyTEnAzf30+89fnUzQ/Q4a8CSGEEEIIMU1IuCSEOOM2H+7i208f5PkD7QRT3PzNZfP54PlzZRa4WSbUPkTNjnaqt7fTfCgEGgLZPpZfXELFqlwK5gUlUBJCCCGEEGIaknBJCHFGaK158WAH3376IK/VdJHj9/DFaxZx28Y5+L3y0TNbWHGbnU83sH9TC52N/QBkl/hZf105FatyyC72y5A3IYQQQgghprkZdYanlLoBuKGysjLZTRFi1tJa85e9bXzn6Sp2NIQoSPfx5RuWcPP6MlI8MvxtNmmpDvHMr/bR1TRAYWWQ899ZScWqXNJzUpLdNCGEEEIIIcRppLTWyW7Dabdu3Tq9ZcuWZDdDiFnn5YMd/Ouje9nb3EtpVgofv6SSt68pxuuSUGk2iYbjvPpQNW8814A/w8vFty5k7vKcZDdLCCGEEEIIcYqUUlu11uuO3j+jei4JIZKjqWeIf390L4++0UxpVgr/956V3LCiCJfTkeymibPs8M4Onrt3P/09EVZcUsKGGyvw+ORPjRBCCCGEEDOZ/McvhDhpkbjFT16o4TtPH8TWms9csYCPXFQhs7/NQoO9UV544AAHt7SRVZTGO+5cRkFFMNnNEkIIIYQQQpwFEi4JIU7K0/ta+cojezjcOcjVSwv40nWLKc1KTXazxFmmtWbfK8289OBBYlGLDW8tZ/WVc3C6pNeaEEIIIYQQs4WES0KIE1LbOcBXHtnDU/vamJebxt13nMOF83OT3SyRBD1tgzz76/007u+msDLIW25bRGZBWrKbJYQQQgghhDjLJFwSQkzKYDTO9545xI+er8btVPz9tYv4wHnleKSHyqxixW1qd3VyYFMLNW904HI5uPjWhSy9oAjlUMlunhBCCCGEECIJJFwSQrwp29Y8srOJ/3p8H02hMG9bXcwXr1lEfrov2U0TZ4nWmrbaPva/2kLV5lbCAzFSAm6WX1TCqivK8Gd6k91EIYQQQgghRBJJuCSEmNCr1Z38x2N72dkQYklhOt+4eTXnlGclu1niLOnrCrN/Uwv7X22hp3UQp8tB+aocFm4ooHRJFk6ZDVAIIYQQQgjBDAuXlFI3ADdUVlYmuylCTGsH2/r56uP7+MveVgqDPv73XSt52+piHDLsacaLDMWp3tbO/k3NNO7vAaCwMsjqKxYxb00u3lR3chsohBBCCCGEmHKU1jrZbTjt1q1bp7ds2ZLsZggx7XT0R/jmX6q457U6UtxO/uqSedxxQTk+tzPZTRNnUCxicfiNDqo2t1K3uwsrbhPMTWHhxgIWbiggPScl2U0UQgghhBBCTAFKqa1a63VH759RPZeEECdnKGpx10s1fP/ZQwzFLN67oYxPXTafHL/U0pmp4jGLut1dVG1p5fDODuJRm9Sgh6UXFTF/XT755ekoJT3VhBBCCCGEEMcn4ZIQs5hta363rZGv/Wk/Lb1hrliSzxevWcS8XH+ymybOAMuyadjbzcEtrVRvbycatvD53SzcWMj8dXkUVmbI0EchhBBCCCHECZNwSYhZqC8c47dbG/jFK7XUdAywsiTIN29exYaK7GQ3TZwBnY397H6haWSmN0+Ki4o1ecxfm0fxokwpzC2EEEIIIcTpoDWEe6CvFfpbRteBQljx7mS37oyScEmIWaSmY4BfvHyYB7c20B+Js7osg+/euoZrlhVIj5UZJha1OLiljd0vNNJa04vT5aBiVQ7z1+dTtiQbp1sCJSGEEEIIISZFa4j0Qm+TWfqaobc5ESC1QH9rIkhqBSty7PHzLpNwSQgxvdm25oWDHfz8pRqe2d+O26m4fkUR7z9vLqtKM5LdPHGaDfdS2r+phehQnIz8VM5/ZyWLNhbi88tMb0IIIYQQQgAQG4JwCIZ6zDocMr2OhrrHBEhjgqTYwLH3kZIJ/nyzzDnXrAMFR679+eANnO1nd9ZJuCTEDNUfifO71xv4+cuHqW4fIMfv5dOXz+fWDWXkBXzJbp44jeJRi4Nb29j9QhMt1SEcLsW81Xksu6iIwsoMKcwthBBCCCFmByuW6F3UaNahhtHL/a1HBknj9TAa5nCboWzpRVCwHOZfBemFo/sCiW23nFcNk3BJiBkmErf41lNV/PLlWvoicVaWBPnGe1Zx7fJCPC4ZCjUdtNSE2PdyM9GwdeQVWh9zW9vSNOzvJjI42ktp4cYCUvyes9RaIYQQQgghJqG3CfY+AvGw+b9W24BObOvRbRLXaRtsC7SV2LbHbCf225bpbRRqTARIbeb4sbzpkF4MgXyzTskAXxB8ifXI5czRyylZ4JBzpxMh4ZIQM8jBtj4+ee929jb3cv2KQu64oJzVZZnJbpaYBG1ranZ2sP0vdTQfDOH2OUlNPzYgGq8XUtnSbJZeUETRAumlJIQQQgghppi2ffDyt2Hn/WDHTuBABQ4nKCcox+i2w2EuK6fZ502HYDHkL4H0EtOzKFg8uu1LP2NPTYyScEmIGUBrza831fFvj+4h1ePip+9fx2WL85PdLDEJ8ajF/k0tbP9LPT2tgwSyfFzwrvksPr8Qj08+ooUQQgghxDSkNdS9Ai99Ew48Aa4UWPch2PBRU4sIBUqZkGh4e+w++cJ02plRZy5KqRuAGyorK5PdFCHOmq6BKF/47U6e3NPKhfNz+N93rSQvXcb+TnVD/VF2PdfIG882MNQXI7cswJUfXsq81bk4nNIFVwghhBBCTEO2BfsfM6FSw2ZIzYZL/h7WfxjSspPdOnEGKT1ODY/pbt26dXrLli3JboYQZ9yLVR185oHt9AzG+PzVC/nQ+eU4HJLyT2U9rYPseKqefa80E4/ZzF2ezaoryiiaL0PahBBCCCHENBULw877zPC3zoOQORfO+ySsvBU8qclunTiNlFJbtdbrjt4/o3ouCTFbROM2//vn/fzw+Wrm5abxsw+uZ2lRMNnNEm9iIBTh1Yer2fdKMw6nYuGGAlZdVkZWUVqymyaEEEIIIcSJsS1o3w+NW6FxC+x7DAbaoGg1vOvnsPitph6SmDUkXBJimjnU3s/f3LeNXY29vHdDGf9w3RJSPPLBPVXFoxbbn6pn6xO12HGbVZeVsuqKMtKC3mQ3TQghhBBCiMnpbYKGLYkwaSs0bYNov7nOG4S558PGv4K5F0q9pFlKwiUhpgnb1ty3uZ5//eMefG4HP3zfWq5aWpDsZokJaK05uLWNV353iL6uMBWrcjn37fPIyJNuwUIIIYQQYgrQGmJDMNQN4R6zHuqGoZ7RfcO9k/qazTEONxQsg5W3QMk6KF4LWfPMDG5iVpNwSYgpTmvNM/vb+J8/HWBvcy/nV2bz9XevIl+Kdk9ZbbW9vPhAFc2HQmSX+Lnx/aspWZiZ7GYJIYQQQoiZLB6BwU4Y6IDBDhjsGrM9vL/TLMNBkhWd+P6UEzLKYO4FJkQqXgcFy8Et5yHiWBIuCTGFbaru5H/+tJ8ttd2UZaXyjfes4q0ri6Ro9xQ10BPh1YcOse/VFlICbt5y2yIWnVcoPy8hhBBCCHHy4hHoazFLf8vodl+L6VHU32rWQ90T3IGC1CxIzTGzt+XMh5QsSMmAlEyz+Ia3M0YvewMyxE1MmoRLQkxBuxpD/Pef9vP8gXbyAl7+7aZlvGd9KW6Zon5Kikcttv+lnq1/qsW2bFZfWca6a+biSZGPWCGEEEIIMUZ0APrbzDK2B9FQNwx1HXU5MUQt0nvs/Thc4C+AQD5kVUDZuRAogLSc0RBpeDslQ4prizNOznyEmEIOtvXz9Sf389gbLWSkuvn7axdx+7lz8bnlj8FUFR2K84dvbae1ppeK1bmc9/Z5BHOlrpIQQgghxIyltRlOFuk3Ra2jA4l1v9k32AH97aZH0UDbaJg00D5aBPtoyjnaiyglEwKFkLckcTnLBEeBQhMmBQrNPqlzJKYQCZeEmAIae4b45l8O8ODWBnxuJ5+6tJIPX1RBus+d7KaJNxENx/njd3fQXtvHVXcuo3JtXrKbJIQQQgghToVtQ28DdB6CrkPQWW3W3bWmB9FwmGTHj39fKVngzzNL8Vrw54M/16zT8iAtOzE8LVOGoIlpT8IlIZIobtn84LlDfOupg6Dgg+eX81eXzCPHf3amqY+G48QiFmnBs/N4M0ksavHY93bSUt3LlXcslWBJCCGEEGK6iPRDb6NZeuoSQVL16NqKjN7WlWKGnWXPM3WIPGlm8frB409cHrudZoajpeWCU74oFrOHhEtCJElNxwCfeWA72+p6uG5FIV+6djFFGSlntQ0v/fYgtW90cvu/n4tD6jlNWjwRLDVV9XD5B5dIsCSEEEIIMRVYcVOnaLDDFLvubYTeJgg1mHVvI4QaIRI68jinBzLLIbsS5l8OWfNMmJQ1zwxBk+FnQhyXhEtCnGVaa361qY7/eHQvbqfiW7es5q0ri5LSlqYDPQz0RGis6qF0UVZS2jDdWDGbx3/4Bg37u7ns9sUsOKcg2U0SQgghhJi54hEzE1pvk1n620x4NNBhCmIPdia2O0zxa/Sx95GaA8FiEyDNOd9sp5dAehEES8wiBa+FOCUSLglxFrX2hvn8gzt57kA7F87P4X/euZKCoC8pbQn3x+hpHQTg4JY2CZcmwYrbPPHjXdTt7uItty1i0bmFyW6SEEIIIcTUFI+YMMi2QFug7cS2PeaybdZWBPpaTa2j4RBpuLfRQNux962cZja04RnR8pceOTtaapapaxQshkARuJPz/7YQs8mMCpeUUjcAN1RWVia7KUIc4487m/iHh3YRjll85calvG/jHFQSi/a11JjuwIFsH9Xb2rnolgU4ZWjchCzL5s8/2c3hnR1cfMsCllyQnN5mQgghhBBTTnQQWndD83Zo3mGWtr1gx078vrzBRM+iIihcMaaHUSIo8ueZ2kcyVE2IKWVGhUta60eAR9atW3dnstsixLDQYIx/fHgXf9jRxMrSDL7+7pXMy/Unu1m01vSiFGy8sYIn79pD4/5uypZkJ7tZU5Jt2fzlZ3uo3t7OBe+ez7KLS5LdJCGEEEKIs8+Km2FonQdHQ6TmHdCx3/RAAtODqHAlnPcJyJ5vilorh1kczsS2c8y2AxwuCBSYEMkbSO5zFEKclBkVLgkx1bxQ1c7nfrOTjv4In7liAR+/ZB6uKdI7qLUmRHaJn4rVuXh8Tg5uaZNwaRy2rXnqF3s5uKWN895RycpLS5PdJCGEEEJobWb1atwKrbtgwTUw59xkt2p60hoG2s2saX0tZnugI7FuG7PdDoNdHFHTKFBogqQlbzXrwpWQXgxJ7J0vhEgOCZeEOAMGo3G++vg+fvlKLfNy0/jR7eexoiQj2c0aoW1Na00v888pwOV2Ur4yl+rt7Vx860KcrqkRfk0F2tY8c/deDrzWysabKlh9RVmymySEEEKMz7bh6X+F3b+DeZfC8ndB6capNXTIisPu30PtSyaUGC6kPLy4vBMfO9BpgqTGrdC4xayHukevf/k7cPVX4Zw7Jdg4mtYmFOo5bAKknjrork1sJ9bx8LHH+YKQlgtpeZCzwBTCTssFfy5kzIGCFRDIP+tPRwgxNUm4JMRptvlwF3/7mx3Udg7ywfPn8oWrF+FzT63ZJ7paBoiGLQrK0wGoXJfH/k0t1O/tYu7ynCS3LjliUYv+rjD9XRH6usP0dYZpPdxL/Z4u1l9fztqr5ya7iUIIIcT4ogPwu4/Avj9CyTmw/V7YcpepVbPsbSZoKliRvNAl0g/b7oZXvgehOvAEINp37O38+WPCplJTlLl1jwmTug+b2ygH5C6GRddDyTooXmeGUj30cXj8c9CyE6773zcPqqaqoR449JQJ0vx55vUYXnuPU1LBts2Mal3VRy010F0D0f4jb+/LgMw5kLsQ5l9pwqKMMjM0LS3XLC7PmXqmQogZSMIlIU6TcMzia3/az09fqqEkM4X7PrKRjRVTc5hZa00vAAUVQQBKF2fhSXFxaGvbjA+XIoMxqja30t06aIKkrjB9XWHC/UcWnFQK0jK8bLixgrVXz0lSa4UQQojjCDXCvTeboWFX/xds+KgJm/Y/Bm88CK9+H17+tql9s/ydsOydkHOWJr/pa4XXfgibfwrhHig7D679b5h/lSn03NtoZgQLNUBPPYTqzXbrHjjwZ4gPmSFWxWtg7QdNmFS4avyg5eZ74Nn/gOf/B9r3w3t+NT161XQegv2Pw4EnoPZlM4vaeNxpxwZOTo8J3bqqTYA0tveRww2ZcyGrAuaeb8KjzESAlFFmeiUJIcRpJOGSEKfBtrpuPvubHVS3D3DbxjL+7prFpHmn7q9Xa3UIb6qLYF4KAE6Xg4pVOVRv7+CSmI3TPYW60J8m/d0Rdjxdz+4XGomFLVxeJ4EsH4EsL3lzAvizfInLPvxZXtIyvDJ7nhBCiKmt8XW49xYTJt1yPyy40uz3+mHFu80y2AV7HjZB07NfhWf/0wQ0y98FK282U7efbh1VJtDacR9YUVh8PZz3N1C6fvQ2Dq8JPrIqxr8Prc3zOl6PnZH7c8Cl/2CmpH/o4/CjS+DmX0Hx2lN+OqeVFYf6TXDgcdj/BHRWmf25i+H8T5naUVnl0N8G/a3HrgfaoOMAHH4BYuHRAKnystHXM6vC9P5yTK2e80KImW3qnv0KMQ1E4hbf+EsVP3zuEAXpPn51xwYumD/1e/601PSSXx5EjekeX7kun32vtFC3t4vyFVP/OUxWV/MA256s48CmFrStqVyXz+orysgp9R/x/IUQQohpZc/D8LuPmuFLd/zOhCrjSc2CdR80S28T7PodvPEb+POX4Kl/gaVvg/UfhpL1pz5srm4TvPwt2Peo6VWz+r1w7icge96J35dSkw+Wxlr6NsiuhHtvhbuugbd+G1a+58Tv53SIhaGvyfQu66mD6mfh4JOmVpTDDXMvMDWiFlxlQqKx/HnAsiQ0WgghTo6ES0KcpF2NIT77wA72t/bx7nUl/MP1S0j3uZPdrOOKDMXpah6gcm3eEftLFmXiTXNxcGvrjAiXWqpDvP6nWmp2dOByO1h6QRGrrigjPScl2U0TQgghTp7W8OLX4amvmEDo5nsSQcQkpBeZ6eHP+wS07YMtPzX1mXbeb2oyrf+wGTrnSZvc/cWGzFCuQ0+bpW0PpGTCRZ+Dcz5iCj8nQ8Fy+Mgz8JsPwO8/Aq1vwOX/cvyePJF+U9+pbpMZaubymtfCnZJYUo9dO5zQ3w69DSa8CzWa4X69jTDYeeT9p2TBgqvNMu9S8KWfsZdACCHONgmXhDhB0bjNd545yHefOUh2moe7PrCOSxdNgzH9CW2He0FDQfmRY+2dTgfzVuVStbWNeMzCNcWKkE+G1praXZ28/qdamg+aoX/rrp3LireUkBKQopRCCCGmuXgEHvkb2HGvqZ1043fB7Tu5+8pbBNf+D1z2ZXjjAXjtJ/DIp+DP/2h6HK2749jaTFpD6+7RMKn2ZbAippdS2blw7ddg1a2TD6fOpLQceN/v4U9/b4bote6Gd95lwq9hoUaof9WESfWvQsuuRM0jZYaVWTEToMUGTY2o40nJNDWi0ovMcLz0YggmLqcXm+FqMlRNCDFDSbgkxAmobu/nU/dtY1djL29bXcw/37CUYOrU7600VmtNCBTklR/7bVnl2nz2vNRM3e4uKlYl6dvGk1S/t4sXf1NFV9MA/kwvF7xrPovPL8Tjk485IYQQM8BAJ9z/Xqh7BS75e7j486dn9jevH9Z9yBTMrnsVNv8EXvsxvPo9qLjE7I9HTJhU/Yyp+wOmRtD6D5seOHPOA0/qqbfldHO6TYCWvwwe/Sz8+FJYfyc0vW4CpVCduZ071YRBF34GSjea2lBHF7weCZoSYVNs0GxbUUjLg/TCqRGqCSFEkshZlxCToLXmwa0NfPkPu/G4HPzgtrVcvawg2c06KS3VvWQWpOFNOfbXv3hhBj6/m4NbWqdNuBQdivPS7w6y54UmgnkpXP6BxVSuz5di3EIIMRPFo7D791B+kTmZnw3iEah/Df7wCehrMb1vlr3j9D+OUjDnXLP0/Qds+yVs+Tn85v3m+tRsqHiLCZPmvcX0xpku1r4fchfB/bfBn/4OAoVQugHO/bhZFyw3QdSbcbrNIkPZhBBiXBIuCXEcveEYX/r9Lh7Z0cTGiiy+8Z7VFARPsgt6kmmtaakJUbFy/ODI4XQwb3Uu+19rJRa1cHumdtft+j1dPP2rvQx0R1h1RRkbbijHNcXbLIQQ4iRF+k04UP2MGYa14j1w/t9Azvxkt+z0CjWYMKlhCzS8Bs07RnvHfOBRKFl35tsQyDd1k87/f2ZWspRMU5PJMY2/uCnbAJ963RTTDpaenl5fQgghRki4JMSbeL2um0/du43mUJjPXbWQj108D6dj+v4zEmobIjIQp6AiOOFtKtfls/uFJmrf6Dym6PdUER2K89JvD7LnxSYy8lN5++fWvulzEkIIMc0NdMI974KmbXDlv0N3DWz7lVkWX29CkJIpNuX8eLQGbYNtmdo+Vgza9yXCpNegfrOZXQzA5YOi1bDho1ByDpRfeGS9oLPB6TK9lGYKb8AsQgghTjsJl4QYh2VrfvDcIb7+5AEKgz4e+Oi5rJ1zlv+hOwNaa0IA5I9Tb2lY0fwMUgJuDm5tm5LhUt2eTp65ex8DPRFWX1nGOddLbyUhhJjRQg1w99uguxbe82tYdK3Zf/EXYdMPYPOPYe8jMPdCuODTMO+y5PRKsW1TD2nnfbD/CVOTZ2yQZFuAnvj4jDJTu6hkvan5k78cXDIZhRBCiOlBwiUhjtISCvP/7t/OK9WdXL+ikP94+3LSfdOraPdEWqp7cfucZBZOXHDS4VDMW5PHvpebiYbjU6YgdnQozksPVrHnpWYyC6S3khBCzArt+02wFOkzM3/NPX/0On8uXPaPJlDa+nN45Xvwq3eY+jnnfxqW3GR63pxpHQdNoLTjflMg2p0GC68Bf74ZRqacoBxmlrCR7TH7s+eZnkmB6TPzrBBCCHG0qXHWKMQU8Zc9rXzuwR2EYzb//c4VvGttCWoGjclvqQmRPzcdx3GG9s1fl8eu5xqp3dXJ/HXJ/2e3bncnz/xqTG+lG8pxuaW3khBCzGgNW+HX7wSHy9QaKlwx/u28ATjvk3DOR+GNB+DFb8Bv74Cn/9XMEhYPm6LY8TDEwkdeHl570iBvCeQvSayXQt7iiYdQDXTC7t/BjvugcYsJiSouMWHXoutk1jAhhBCzjoRLQgBDUYuvPr6XX7xSy9KidL51y2rm5fqT3azTKhax6GwcYO3Vc45724J5GaQGPRzc2pa0cCk6FKdmRzsHNrdRt7vT9Fb6/FoKyqW3khBCzHiHnob7bjO9k973e8iqOP4xLg+svg1W3gr7HzND5roPg8tr6hd5A6Yo9vDlseuhLmjdA9t+DbGB0fsMlh0ZOCkHvPEgVP0Z7BjkLYUr/hWWv2v2zF4nhBBCjEPCJTHrba3t5m9/s4OajgE+dH45X7hmIV7XzOsV017Xi7b1m9ZbGuZwKCrX5LH7xaazOjQuFrE4/EYHB7e0UburEytu48/ysv76ctZcVSa9lYQQYjbY9Tv43UcgdyHc9lsIFJzY8Q6HKfK9+PoTf2zbNkPbWvdA2+7Eei8c/AvYcXMbf74psr3yZjMETwghhBAzK1xSSt0A3FBZWZnspohpIByz+L+/HODHz1dTGEzhng9v4LzKnGQ364xpqe4F3ryY91iVa/PY+UwDh3d2sOCcE/zH/gTEYxZ1u7qo2trK4Z0dxKM2qUEPSy8sYv76fPLnpqOm8Qx9QgghTsBrP4bHPgdl58It90JKxtl9fIcDMueaZbhwOJjhcx1VpvZTyfqzU8tJCCGEmEZm1F9GrfUjwCPr1q27M9ltEVPbGw0hPvPAdqra+rnlnFL+/trFBGZI0e6JtFSHCOalkOKf3MwzBRVB/Jleqra0ndZwKR6zCLUN0dU8QO0bnVTvaCcWtvD53SzcWMj8dXkUVmYcty6UEEKIGURreO6/4Nn/hAXXwLt+Bu6UZLdqlMsLBcuS3QohhBBiyppR4ZIQxxON23zn6Sq+++whcvwefvbB9bxlYV6ym3XGaa1premldHHWpI9RiVnj3niugchQHG/K5D8utNaE+2N0twzS3TJAd+sgPYnt3s7wyEzM3lQXlWvzmL82n+KFGTicjhN9akIIIaajoW5o2gaNr5ul6XXoazb1kt76bekZJIQQQkwz8pdbzBp7m3v57AM72NPcy9vXFPPl65cSTJ3ZvZWG9XWFGeyNTnpI3LDKtXnseKqemh3tLNr45oVKta2p3tHOG8820NHQT2QgPnKd0+0gIz+VvLnpLNxQQGZBGhn5qWQVpeF0SaAkhBAzWnQQWnaOhkiNW6GrevT67EqYeyGUXwSr3muGpgkhhBBiWpFwScx4ccvmB88d4ptPVRFM8fCj963lyqVnrobQVNSaqLdUUHFiM63ll6fjz/JycGvbhOGSZdlUbW7l9Sdq6W4ZJD03hco1eSZAKkglMz+VQJZP6iYJIcRsMdABtS9D3StQ+xK07AJtmesCRVC8xszqVrQGilaf/bpKQgghhDjtJFwSM1pD9yB//evX2dEQ4voVhXzlxmVkpU2u5tBM0lITwuV2kF2cdkLHKaWoXJvPzqfrCQ/E8KWN9vSKRy32vtzMtj/X0dcVJrvYz5UfXsq8NXlSL0kIIWaTnvrRIKn2FejYb/a7fKb49QWfhuJ1JlQ60ZnfhBBCCDEtSLgkZqzazgFu/fEmesMxvnPraq5fUZTsJiVNa00veXPTT6qm0fx1eWx/so6aHe0sPq+I6FCcXc83sv2peoZ6oxRUpHPRLQuYsywbpSRUEkKIGW2gE9r3QfteqN9seiiF6sx13nQo2wgrb4Y550PRKlMIWwghhBAznoRLYkaq6Rjglh+9Sjhuce+dG1lWfGLDwWYSK2bTXt/HyktLT+r43LIA6Tk+9r3SQm9HmDeebSAyGKd0SRZrr55D0fwMCZWEEGKqsmKw52GoeR5SMiEtB9JyITUnsZ1jtt2+0WO0hv62RIi0/8j1YMfo7dJyYc55cO5fm3X+UnA4z/5zFEIIIUTSSbgkZpyDbf3c+uNXiduae+/cyOLCEytiPdO01/dhx/UJ11saNjw07vU/1dJU1UPF6lzWXj2HvDmz+3UVQogpbbALtv4MXvsJ9DWBLwixIbCi49/emw6p2eBLh+5aCPeMuS4IeYtg0bWQsxByF0HuAgiWgny5IIQQYpbQWmP19BBvayfe1ka8vR0A5fWgPB4cXi/K40F5vInLZr/yenGkpuJMn9nnTxIuiRllf0sf7/3Jq4Divo9sZEF+INlNSrqW6hDACc8UN9bKy0pRDliwvoCsohOr2ySEEOIsatsHm74PO+6H+BBUvAVu+CZUXm6CoEgfDLSbotuDHYntdjPcbaDdhErFaxMBUiJI8udLiCSEEGLK0raN3deH1deHFQqZ7VAvdl8vVqgXq68Xu7cXOxxBud0m8HG7UR6z7fAkQiCPB+X2gFJYXZ3E2tpGg6TWVuLt7ejoBF/SHEfaBRdQ9pMfn+ZnPrVIuCRmjD1Nvdz20024HIp77txIZZ4/2U2aElpreglk+UgLnnzdi9R0DxtvnHcaWyWEEOK0sW04+BcTKh162hTSXvEe2PAxyF9y5G196WbJls90IYQQZ5/WGh2JoMNh7HDYrCMR9NAQdjiCjoSxh8LoSBirvx+7rx+7vw+rrx+7vx+rv8/s6+tLXN+HPTBghnRPxOnEGQigfD50LGaWaNQERbY94WEOvx9XXh6uvDxS1q7BndgeWXJywOFERyPm/iJmbUeiifsfvhzBnZd3Bl7NqUXCJTEj7GoMcdtPN5HidnLPnRspz5HeNcNaakInPSROCCHEFKA12JYZ0mZFTB2leMRcPvQ0bPoBdB6EQCFc9k+w5gOQlp3sVgshhJjGtG0Tb2nBHhgwvXzcbnC7TS+fMZeHa69qrbF7e4m1thJvbTO9fdpaTe+f1kTPn7Y24p2dbxrojEe53TgCARwBP05/AEcggHtOGb7EtjMQwBlMxxFIT6wDOINBnIEAjvQgjrTUCWvE6nh8JGiyo1GIxdC2jTMzC6dfzilPhIRLYtrbUd/D+366iYDPzb13bqQsOzXZTZoyBnoi9HdFKLhMwiUhhEiaSB/UvQoNmyHca4arxcIQG4R42NRCGl4Pbw+HR1bUbPMm38gWrYF3/BSW3AhO91l7WkIIIaYGq6eHaH0D8bZWHGlpODMyRhaHz/emx9qRCNHDtURrqolUVxM9VE2kpppozWH00NBxH3s4aNKWhY5EjrnemZFhevnk5+NdvAhXTg6O1DQcPi/K58Ph86G8PhwpifXwfq8Xh99vQiXvmZt5VLlcKJcLUlORKSlOjYRLYlrbWtvNB+56jYw0EyyVZEqwNFZLTaLeUsXMLh4nhBBTSnQQ6jfB4Reg5gVo3AraAuUAj98MW3P7wJUC7sTi8ZvZ19wpZr/LC06PCYtGthOLa3jbC9mVULxGaiIJIcQ0YIfDRKoOEt63l8i+/diDg6aHTTAdRzCIMz04ctkZDOJITzdFoLUm1tJCrL6eaF09sYbEur6eaEMDdm/vhI+pvN4jwiZnRgbO9ACxtjai1TXEGhqOGFLmLi7GU1FB2vr1eMorcGYEE8PIYuhYdHR91D4cDlx5ebjz80bCJFde3hkNhsTUIuGSmLZeq+nigz97jdyAl3vu3EhRRkqymzTltFb34nApckuksLkQQpyQrhroPHRUCDS87QN3qgl4lDK9kBo2j4ZJDZvBjoFymuDn/L+B8guhdAN4pIu9EEJMN1prMzzM6TRFn53H7+MSb28nvG//SJAU3rePaE3NyJAwR2oqjvR0rN5e9ODgm9+Z0wmWNXrZ7cZTXIy7tJTgqlW4S0vxlJXiysvHHhzECvVg9fRg9YTMOjS6HTl4EKs3hCs7h5Tlywi+9a14KsrxVlTgmTsXR4qcU4mTI+GSmJZerOrgzl9uoTDDx713biQ//c27e85WLTUh8soCON2OZDdFCCGmvnAIdv8ett8L9a9O4gBlQicrlgiTHFC4Ejb+FZRfBGUbwSvhvhBCTFVaa+y+vkR9oDZTH6i9fXSGsDGLjsVGDxyuPeT1msXjxuFJbLtcROvrsTo7R27uKirEt2gx6VddiXfhInyLF+EuKUE5zP/oOhrF6u3FCoXM7GahHuzexExnoRDaiuMpKcFdWoantARXfv6kAi4hziYJl8S0orXmh89X899P7GN+XoC7P3wOeQEJlsZjWTbttX0svag42U0RQoipy4pD9TOw/R7Y/5ipd5SzAC77MpSdawpox8KJOklDR9ZHGl47XCZIKjsXUjKS/YyEEGJGiXd0EN67j/DevUQOHADbwpGWZur2pA0vqaPbif06HsPq7ibe2YnV1Y3V1UW8q+uItdXVdWRolOAIBMzQrtzckVnCnJlZoG0zs1nEzAxmj8wSduRl/8UX41u00ARJixbiDL55/VPl8eDKyTGzjwkxTUm4JKaNvnCMz/1mJ0/sbuG65YX81ztX4PfKW3ginQ39xGM2+eVSb0kIIY7RutsESm/8BvpbISUTVr8PVt1iCmRLDSMhhDgpOh43vYBaWrB6e3GmpZnCzInFmZaG8niOPc62idXXE967NxEm7SGydx/x9vaR27iKCnG4PViDA+iBQezjDScbw5GaijMrC2dWFu78fHyLF+PKzsKZlY0rL3d0mvncXBypUsdViBMlZ+ZiWqhq7eOjd2+ltmuQf7huMXdcUD7hdJLCaK0xhf0KKmSmOCGEAKC/3YRJO+6BljdMj6P5V5lAaf5VplC2EEKIcWnbxu7vN8O3OjpMgenmFuItLWa7pZl4S6sJg44z1bzyeMYETmkol5vooUPYAwPmBi4X3nnzSDvvPHxLFuNdtHjcHkDatrEHh7AHBswyODiyrZwOExxlm0DpeLOmCSFOjYRLYsr7484mPv/gTlI9Tn794Q1srMhOdpOmhZaaEGlBD/5MmaFBCDGLxSOw/3HYcS9UPWlmbStcBdf8Nyx7J6TJ3xQhxMxgRyJH1gtqbyfe3o7V3WVu4HCinA5wukytH5cT5XCOrp0O9OCgqfPT24vd1zuybS73jRsaqZQU3AUFuAsL8J5/Pu6CfFwFBbgLC3Gmp5sC0/392P2JAKi/H3ugf3Rffz86EiF40034Fi/Cu3gx3srKSc0yphwOnP40nH6ZLEGIZJNwSUxZMcvmq4/v46cv1rB2TibfvXUNBUH5xmGyWqp7ya8ISg8vIcTsozU0bDE9lHb9DsI9ECiE8z4BK2+BvMXJbqEQYhaJd3QQ3rff1ApKTR1ZVGqqqQ+UmjJS2HksOxrF6k7M+tXdnZj9a/RyvLtrJECKt3dgh0LHPrjLhSszE5RC2zbE40estWWZWcgSoZFyu3EEgzjT082Sk42nosJsB9NxBBL7s7NwFxbiLijAkZ4u/28KISRcElNTW1+YT9yzjddquvjAeXP5+2sX43HJjGeTNdQXpbd9iKUXFiW7KUIIcfaEGmDHfWbprAJXCiy+HlbeDBVvAYfMrCOEOHO01sQamwjv3UN4zx4ie/YS3rPniJpBE1EpKSOhE5ZFvKfnTaenVykpuDIzceXm4i0vJ+2cDbjycnHl5o7UDXLl5uLMzBw3uBqv7VgWOJ0SFIlZR2tNvGOIaE0vkZoQsZYBlNeJ0+/G4fck1m6cfg8OvxtHmhtnwIPyJv6vsDQ6aqFjNnbMHtnWUQsdtdExC0eaG9/8zOQ+0TNMwiUx5Ww53MXHf/06veEY33jPKm5aLbOdnSiptySEmPGsOHQehNZdpn5SwxaofQnQMOd8OP9TsOQm8MmkBkKIiel43PQCOmIWsW5T+8fpQDmcKJfTDCkbZ61jcSJVVYki1HtHew85HHjnVZB23rl4Fy/Gt2gxDp/X1AQauwwMjtYJSqyVy4kzIxNnZgbOjDFLZubI9mSGjJ0IpRS45NRQzA7a1sRaBojWhIgcNoGS3W9mDXSkufGU+LGjNrHWQezqEPZgfPw7cirTW/rNS4wB4F2QKeGSEGfTr16t5Z//sJvizBR+8aFzWFwoJwUno6U6hMOhyC0LJLspQghx6oZ6EiHSLmh9w6zb90E8bK53uCF3EVzyRVjxHsgqT2pzhRBTg9XbS6yhgWhDA7GGRmINDcTaWkenpe/uHn8o2QlSHg/eBQtIv+oqfEsW41u8GO+CBThSUk7DsxBi5rD6o8Q7hlBOB8rrRHmdOLxOlMeJcpyZHnNaa+y+GLHWAWJN/URqeokcDqHDFgDODC+++Zl4ytPxlgdx5aQc03tPWzb2QAyrP4bdH8Pqj5r1QAylFMrjQLmdZu1x4nCbtRqzdqTM/Ohl5j9DMW385IVq/u3RvVy6KI//e88qginuZDdpWrJtTeOBbrJL/Lg9MgRECDFNWHEI1UFntemR1HUIOg9BxwEI1Y/eLjUb8pfB+g+bdcEyyFkoM70JMY3pWAx7YABruODzmJm/0NrcaPhkb/icL3FZKWWGtLS3jwZIDQ1EGxuPCY4cgQDugnycWdl4Fy8iLTMrMTV9Jq6sLJyZWbiyMs3MYoEA2DY6boFtjdQmOnoN4C4uRrnl/1YhhmlbY3WFiTb1E2s2oU60aQC7LzrhMcrtGA2bEovT78GZPrx4cQxvB704jjrP0Vpj9UaJtw4Saxsk3jZIrNUsOjza88iVm0Lqilw85UG8c9NxZR6/pq9yOnCme3Gmy0RJb0bCJTElDAdL1y4v4Js3r8btlPpKJ6O/O8KTd+2mpbqXc98+L9nNEUKII2kN/a0mMOqogq5EkNR5CLoPgx0bva0nANnzoHQDrPsQFCw3YVKgYPQkUwgxpdkDA0QbGok11JvAp76BWH09sba2xIxhiZnCohOfcJ4I5fHgLi7GXVJCcNVK3MUluEtKcJcU4ykpOWYaeyFmE3soTrS+zyyN/ei4bXoLORTKmViPd9mpErMMKpRrzLbTYW7nMmsdtog29xNrGiDWPICOmvAVB7jzUvFVZuAu8uPKSwFboyMWdsQaXUeto/bFibUMED7QjY5Yxzwf5XXiDJrQSUctEyKNuZ0j1YUrP5XUVbm481Jx5aXiLkjF6Zcvo84UCZdE0v30xRr+7dG9XLNMgqVTcfiNDp76+V7icZvLPrCYRRsLk90kIcRsFY+Y4KjjQGI5OBooRftGb+dKgawKM3vb4ushax5kV5pQKS1XQiQxq2jbxu7vxwqFsHpCZh3qwQqFTA8cp8vMzlVchLuoCFduLsp54j2UtW1j9/YST9QVsodMzR89Ugdo6MiaQEODoEG5XKbWkMuFcrpQLpeZwj6xrVxOrL5+YvX1RBsbiNU3YHV1HfHYjrQ03KWlZoaxykocaak40tJw+v040tISy9jtVPM5oEdan1gdtQacWdm4cnMmVbxaiGTRWhNvHWRobyfhfd1oy8ZTGhhZxhuSdVKPE7dNTaHhMKm+j3j7kLlSgSsnBYfPhW1rU4za1ibwGblsm8tW4rJlrj8e5XHiLkojdW0eniI/7iI/7rxUlPvUfi/tSByrN4oVimL1RbFCEezeKFZvBKs3inI5SF2ThzsvFXe+CZIkRDr7JFwSSfWzl2r41z/u4ZplBXzrFgmWToYVt3nl94fY8VQ92SV+rvrwUjIL0pLdLCHEbGDFEkW1d5ulbQ+074eeWtBjqluml0DOfFh1C+QsMNvZlRAoAjkRFLOEtixijY1EqquJVtcQrakmUlOD1d5hgqTe3pHp4CfF5cJdUIC7qCixFOIuKsIRDJqp6ju7sLq7iHd2YXV1Eu/sIt7VidXdA/EJitMedf+O1FRTN0gptBWHWBw9PCQsFjPrsW12mQDMU1qC7/LLcZeU4Ckd7j1UgjMjQ2YiE1OC1qbnjNUXRcc1rmzfMcOsTttjxW0i1SETKO3twuqJAOAu8ePwOBnc2srAK82A6W3jLkmETWUBPCUBnGnHDrm0oxb2QGy0DtBAohZQKEK0oY9oUz/ETRjk8LvxlAZIXZNn7rckgMN34jGAmVFwOHCy0ZZGWzbETSilnApnpu+M1E5yeF04cl24c1NP+32L00fCJZE0P3+phn95ZA9XL5Vg6WSF2gf5809201bbx/JLSjjvHfNwuaXOkhDiNNMa+pqhdY8prN22x2x37AcrMZzF4YLs+VC0Cla824RI2ZVm8fqT2nwhziZtWUSqqohUHTQBUnUN0epqoocPHzH8y5mVhae8HN/SpTgzgjiCQZzBIM5ghllnDF8O4kxPR8dixJqbiTU1maWxaWR74JVXiLe1HdGTB8CRmoozOxtXVhbu4mJSViw3PXyys3BmZppeQqmppgdRSorZTizKM7lv/bVtQ9yETsrtNj2ahEgiO2oR7wyP9m7pM4vdF8Xqj41s69iRYa4z6MWVm4IrNwV3bmpiOxVn0HPCoajVHyW8r4uhvV1EqrrRURvlduCtzCBwaSkpi7JG6vdoWxNvGyRa10ekrpdofR99Vd0jHfVcOSm4sn1Yg/FEiBRFR8cPopXbgbvIj39jkQmnSgM4M7ynJdQ1MwoqlAtAzjfEsZTWx+/eNt2sW7dOb9myJdnNEG/iFy8f5st/2M1VS/P5zq1rJFg6CVVbWnnmV/twOBSXvm8xFatzk90kIcRMoDV010DTdmjeAc3boXknDI0Z3pJeDHlLIH+JqYOUt8SESVJUW8xCWmti9fUMvPwyAy+/wsCmTUdMR+8uLcFbXoGnogLvvAo85RV4yufiyjy9U1LraJRYWxtWT2i0KLXv+IVqhZiOhgOkeMcQ8c6hxDpMvHMIu/fYGl6OVBeO4eLQfrcpDJ24jEOZ49uHiLUPEm8fOqJ2j/I4EgFPiikoP+4wMj0yjEzHbOLtZjipM+jBtygL3+JsfPOCqEl+CWxH4kQb+onWmSFtViiCI9WFM82Nw+/BkeY2zyPNjcPvTux3m5nJpHegOMOUUlu11uuO3j/lv1pQSlUAXwKCWut3Jrs94tT98hUTLF25JJ9v3yLB0omKRS1efKCKPS82UVAR5Io7lpCeLVPdCiFOgm0ngqRtJkRq2m6CpMjwibHbBEiLr4f85ZC/1NRHSs1KZquFSLp4VxeDr77KwCuvMPDyK8QaGwFwFRYSuPwy0jZuxLdoEe45c3BMsgfQqVIeD56SEigpOSuPJ8TpprVGh63Rad77TS+dkWFfiZ5H8e7wMQGSw+/GlZ2Cb34mrmwfrpwUnBneRJjkQbkmf74xMnV9ImiKtw8Sax8i1jKQeLAxha5HCl4rcDtwOB3gUKSuzMW3OAt3YdpJhT0OrwvfvAx88zJO+FghkiUp4ZJS6i7geqBNa71szP6rgW9i+tn9RGv9Va11NXCHUurBZLRVnF53v3KYf3p4N1csMT2WPCfwQS+gs6mfP/9kN13NA6y5eg7n3FCOU8I5IcTxRAcTM7NVmRpJHQfNdvuB0QLbTo8Jj5a93QxtK1xpeiS5ZNpdMfNorYk1NjK4eQuDWzYTb21DeTxmWJfHg/K4Ry47PJ6RbSvUy8CmTUT27gXM1PZpGzeQdceH8J93Hu45c6TXgJixtK2Jdw4RbehHD8ZGpot3eBJTx3sS08gPX04UcdZD8dHhaP1RrL5EfaDhy2NCJKzxR9WYnkdunH7PEQGSK9sMGTuZGkITUUqZUCrdAxLuCDFpyeq59HPgO8Avh3copZzAd4ErgAZgs1LqD1rrPUlpoTjt7n61ln9MBEvflWBpUmxb017bR92eTur3dNFS04svzcVbP7mK0iXSc0AIMYbW0NcC7XvNrGwdVYkw6RCE6o+8bXqxmZFt5XtMiFS4EnIXy7A2MWNprYlWVyfCJLPEW1oAcAaDuMvK0LEYOhodXQ8vicsAyu0mZfVqcj/9adLOOxffkiVSY0jMSFprUxy6vp9YQ58pEt3QP+6U8BNSmNn+xptlzKESYZEZ5uXOT8UR8IxcHh7m5fR7cKS5UPJlqhBTXlL+Gmqtn1dKzT1q9znAwURPJZRS9wE3AhIuzQC/erWWf3xoF5cvlmDpeAZ6ItTt6aRuTxcNe7sJD8RAQV5ZgDVXlbH8khLSgtKTQIhZS2sYaIe2vdC+z6yHt8M9o7fzppti2mXnQs7tJkzKng9ZFVJgWySdHYlg9/Zi9fZihXqx+3qx+vrR4SHscOTI9VAYOxJGD4Wxw2F0NIrD5zVFp8cUoHakpiWKUyfWPi+RgwdNoLR1K1aXqRvmzM0hbf16UtatI3XdOryVlcedvl5rDbEYKIVyHztzkxAnYux07zqux0z5bmbgUl4nzoDntM66pW2NjtvoWGIZ2bYgsW1HbeKtA6bWT0Mfdn/MHOxUuAvSSF2Viycxk5nD70ZHbXTUwo5Y6Ig1uj1mH1qbsGg4NAokagaluM7IrGJCiOSZSl+1FANjv1ptADYopbKBfwdWK6X+Tmv9n+MdrJT6CPARgLKysjPdVnEC7nutjn94aBeXL87je++VYOlolmXTdKCHut0mUOpqMuO5U9M9zF2eTenSLEoXZZESkB4FQswa8Sj0NkKoIbGuN9sdVSZIGltc25dh6iAtfZtZ5y2GnIXgzzPfGAtxlsU7O4lUHTQzph08SKylGTvUi9XXh9Ubwu7tQ0cik7ov5fGgUlJw+Hw4fD6Uz4fyeIhHItiDg2YZGHjT+3MXF+O/8EJSz1lP6rp1uMvKTnjomlIKzlLtJDEzaG1mAItUh8xyuBd7KDHsazLzKTkVzgwvrkwfrkwfzkzv6DrLh8Nvwicdt81saKEIVm9iHYpi9Y5Z90VHpqU/LgWu3FR8CzJHpq13F6SNDHETQoiJTKVwaVxa607gY5O43Y+AH4GZLe5Mt0tMzm+3NvB3v3+DSxbm8l0JlkZoremo72ffq81UbW5lqC+Gw6UonJfBuW8roGxpFtnFfqnbIMRMpjW07YHDL0FP7WiAFGqE/laOOftIzYaseaa4du7i0SDJny8hkkgKKxQicjARIo0Jk4Z7CAE40tPxlJTgCKbjzcvDGUzHEUjHmZ4+uh1MxxkI4AgEcKSkoIaDJK8X5ZzczEo6HsceGkqETYnQaXAAT0kJ7qKiM/USCDFC25pY6yDR6p5EmBTCHogDZop737wgzqB3tAi0yzGmGLTDFIR2mMLQdsTC6g4T745gdYcZ2ts52otomFPh8LmwB2LHtEW5HaZmUNCLd046jnSPqYvkdpjC1m4Hyu1EuRwj+5TbLK5sHw7vlD9FFEJMQVPpk6MRKB1zuSSxT0xTj+xo4nMP7uD8eTn84La1eF2T+wdxJhvoibD/tRb2v9pCV9MADpeifHkOCzYUULo4C7dXXiMxe/U98wx2by/BG29MdlPOnFADVD+bWJ6DgTaz35UCwRIIFsP8yyFYauoiBUsS20XgSU1my8U0pLUm3txMeN8+oodrsYcG0ZEoOhJODDkLY0cj6HBkdF8kgrYssOJoywbLQlsW2rYgbqFtG+JxtGVh9/WNPJYjNRXP/Er8l74Fb2Ul3vnz8VbOx5WXe1a+KFEuF85AAGcgcMYfa7axeiMorwvHFPwfRVsaeyBmZhcbjKPDceywhR0esz2U2I6YbeUcLtbsxRk0a0ciiHEmQphxHytuYw/Fj1j0UByrL0rkcC/RwyHswUSYlOnFtzALb0UG3oogzkzvKf8e2FELqydCvDs8EjzpoTiOgAdX0IsjaNbOdA8qxSVfUAohzrqpFC5tBuYrpcoxodLNwK3JbZI4WU/saubT929n3dwsfnz7OnzuqfcPydkSi1rUbG9n/6st1O/tQmvIL0/n4lsXUrk2D1+a1G4Qs5u2LNq/8U06f/xjANwlJaSuXZvkVp0m4RAcfhEOPWMCpc4qsz8tFyouMUv5RSZAkhMBcQq0ZRGtqSG8dy/hvfsI791DZO8+rJ6eI2/ocuHwek2vIJ8Xh9cMNXN4vWbtT0O53KbHkNOZWDtQDie4nCiHE+VygsOJu7BgJEhyFRbKyewMYkctht7oYGBLC9GaXnAqPGXp+BZk4JufibvIf8br5dhDcaINfVi9ozOMjUxRn5hlzB6Mv+kQM+Vx4PC5UD4XDp8TR5obEj2MwlU94xanVj4XzqDH9AoKmwDJHoqjY/aEj+PM9uFbko23PIi3Iogr03c6XoIjODxOHHmpuPPkiwYhxNSktD77I8iUUvcClwA5QCvwZa31T5VS1wLfAJzAXVrrfz+Z+1+3bp3esmXLaWqtOFFP7W3lY7/ayvLiIL+8YwP+Wdq1trOxnx1P1XPw9TZiYQt/lpeFGwpYtLGQjHz5x0AIMMNqGv/2cwy88AIZ73onAy+/gnK7KX/4IRzeaVS43rahtwE6DkDHQbNu2QmNW0Hb4E6FOeePBkr5SyVMEifEHhwk3tWN1d2F1dVltru6iNbVEd67l8iBA+hwGDB1irwLFuBbvAjv4sX4Fi/GO2+eKYAtM5uJCWitidb3Mbi5lcGd7eiIhSsnhdQ1eeiIRfhAN7FmUxfSkerCOz8T3/wMvPMzcZ2GiUbswRiRml4iNSEiNSFiTf1HBEfK7ThyNrHA6NrpN711HCkuHIkgSXldZqjZmz1mJH5UfaLRbR2Oj97nUcsR+1PdOOWLQiHELKKU2qq1XnfM/mSES2eKUuoG4IbKyso7q6qqkt2cWem5A+3c+YstLC4McPeHN5Dum31/bGMRi81/rGH7U/W43A7mrcll4cZCiudnyKwYQowRqaqi/hOfINbUTMGXvkTmze9h4OWXqfvQHWTfeSd5n/1Mspt4rFg4ESAdMMW1Ow6Y3kgdByE+NHo7X9DURSq/0IRJJeeAS4oBz2Raa1Prp294BrSQmQ0tZC4Pz4aGFTdDy2wN2h6zPXxZg2Vh9fdhJQKkeFfXSHB0NEd6Or5Fi/AtXoxvyWK8ixbjrSiXGc3EpFl9UQa3tTGwpYV42xDK7SBlRS5p6/LxzE0/okea1RclcrCHcFU34apu7D5T78eVn2p6NBX7EwGPcyToUSkuU8/nqEDdGogRrUkUu64JEWsZMGGSS+EpTcdbEcQ7Nx1Xpg9HwI3yOKV3nBBCTAGzIlwaJj2XkuPlgx188OebmZfr5947NxJMnX3/2B5+o4Pn7z1AX1eYxecXct7bKvH5Z9/rIMTx9P3lLzR9/guo1FRKvvmNI4bBNX3pS4Qeepi5D9xPytKlyWuk1qZGUsNr0LAF6l+D5h1gDxdPVZA5B3IWQPZ8yJlvtnMWQFqO9EyaoXQ0SuTQIcJ79iaGoO0lWlOD1dsL8fjEByqFIxAwPYccDlCglMNsO5TZVmrkOqc/gDMrC1dWJs7MrNHtrOzE2uxzpKXJCbeYNG1r7MEYdn+MeMcQA6+3Ed7XBbbGUxYgbV0BKStzJlXQWWtNrGWQSCJoitSEJp6RzMFI0OTwudAxm3jbIGB6JHnmpJshZeVBPKUBmZlMCCGmsFMOl5RSaUBYa33s4OQpRsKls++1mi7ef9drlGWlcu9HNpKVNru+oR/oifDCA1Ucer2NzIJULnnvIormZyS7WUJMOdq26fjOd+n43vfwLV9Oybe/hbug4IjbWKEQh66/HldOLuUP3H/2emDEwtC8HRo2myCpYTP0NZvrXClQtBpK15t1zkLIqgD36a+rISZHa43V0UG0oYFYQyPxtlaUx4szPWBmIAv4caQnZiFLTzdDwhwndsJq9Q8Q2b/PBEn7TJAUqToIMRMwqpQUfAsX4p1fiTMj08x+lp6OMz04uh0M4kxPx+H3n/DjC3Eihmcri7UMYPdFTX2isXWK+qNmZrExpYMcfjepa/JIW1dwyrV8dMwi3hNBJ4po2+F4omaRKbA9vE8PxUEpPHMCJkwqCZgZzIQQQkwLE4VLE34toZRyYIpqvxdYD0QAr1KqA3gU+KHW+uAZaq+YRl6v6+aDP3uNogwfv/rwhlkVLNm2Zvfzjbz60CGsuGbDWytYfWUZTvknSYhjWP39NH3+C/Q//TTBm26i4F/+edy6Ss5gkMIvf5mGT3ySzp/eRc7HPnr6GxMLQ9tuaN5peiM174CWN0Z7JWXMgbkXmOFspeshfxk4pRfi2Wb19RGrrx8JkGINDUQbE9uNjRMOFRtXoueQMxAAlxMsG2wbrc0wNK0Tw9Msa2SfPTBgerABzsxMfIsX43//7Yk6RkvwzCkzBa+FSAJrIEa0vo9obS/Rul6i9f3o6JjvgF0Kp9+Dw+/GGfTiLvbjDCQu+z040z14ygIo5+n5n0W5nbhzpaakEELMVm/W5/UZ4C/A3wG7tNY2gFIqC3gL8F9Kqd9rrX915psppqo3GkK8/67XyA14uefOjeQGplEB3lPU0dDHs7/eT2tNLyWLMrn41oVkyAweQowrUlNDw19/gmhtLflf+hKZt733TYfyBC6/nMDVV9Px3e8SuPIKvBUVp/Dg/SY4ahkTJLXvAzsxhMkXhIIVcO7HE2HSOeDPO/nHE5OmLYt4ayvRunpiDfVE6xuI1dcl1vXHzHTmCARwl5TgrSjHf+GFuEtKcJcU4ykpwVVQiI5FTZ2jvv5E7aO+kVpHYy9ryzZD0RzO0WFpDmdi7YDEtjMYxLd4Cb4li3Hl58vwM3FWaa1N4GlrtKWJd4WJ1vWZIKmuj3hHos6bA9yFflLX5uEtSzchUroH5ZUaRUIIIc6eCYfFKaXcWuvYuFeewG2SQYbFnR27m0Lc+uNNBHwuHvjouRRlpCS7SWfF2ILdvjQX579zPgvOkZMOISbS//zzNH7msyi3m+JvfIO0DedM6rh4RwfV112Pp6KCOb+6e3I9RIZ6TIjUtH00SOo8yMiUQ2m5ULjyyCVjjtRHOg3MibCN3d+P1d2N1dNDvKcHq7sHqyexJPZbPT0mVGpqGhliBoDLhbuoCE9JCe7SUjxlpbiLS3CXluApKcEZDCbvCYoZxRqIEWvoI9rQT7S+D6s/aq5QCgWgGP1cUIkFhXIqlNc5OiOZz4UjcVn5xqw9TuyIZeobDSaGhA3GEusjt3XcBksnirkn1rZ9xPC1sRx+N56ydDxlAbxlAdwlARwe6UEnhBDi7DjpmkuJnkpH65uKoZLMFnf27GoM8d6fbCLN4+T+j55Ladbs6LEzEIrw8P9to7tlkCXnF3Lu2yvxyfSzQkwo1tTEoWuvwzN3LqXf/Q7u4uKJb9y8E9r3gycNvH7wBgg9vZmmf/s/8r/4t2S9/0NHhkADHaZG0nCI1LwDug+PXp9eAoUroHDVaJAUKJAgaRxaa+y+PmLNzcSamog1NRFvbibW1Gz2tbagI1EzZMxODCez7dHLlmVOht+M04kzI2NkceXkmPCotBRPqVm7CwpMwWshTiM7ahFrNCFSNBEoWV2JIZUKXLkpuDJ9jPxLPLyhE9t6eJcJf+yIZeoKheNmGNpk58ZRjE5ln+rGmZqYSc3lQDmV6TnnTPSkG77sUOA0a2fADGNzZvnkCy0hhBBJcyrh0mGgFOjGfG+TAbQArcCdWuutp7uxp0p6Lp1ZO+p7eN9PNxHwubnvIxtnTbA02Bvloa+/Tl93hGs/tpzSxePlrkKIsRo/81n6nnqKeY89On6wFB2AXb+FLT+DptePuVprqH8+i8F2DxXXdOLJSiHuKiMWLcYX/dNoTpQ5NxEgrRoNktJyzuRTm7asUIihHTsYfP11wnv3Em8ygZI9MHDE7ZTbjauoEHdhEe78fJTPZ058lQOcDjOMbJy1Iy0NV2bmaJCU2HYEAnJCLE6ZtjV2XzRRLNpCRyzsSNysRy5b6Ii5Pt46QKx1cCQAcmZ48ZT48ZSaHj+eYj8O38kHmtrW6GjisRMFrM3jW6Z3U4oLR2oiUPK5TFgkhBBCTGMnXNB7jCeBB7XWf0rc0ZXAO4CfAd8DNpzOhoqpbVtdN7ff9RoZqW7uvXMjJZmzI1ga6o/yh29uo68zzPWfXEnxgsxkN0mIKW9wyxZ6H3uMnI9//NhgqWUXbP0Z7HwAIr2Quxiu+W+ouARig6ZOUqQPFe2ncGMj1V/8GS31V5NWcD1D7YWAA3/FzQQvz0EVLocU+Z0cj9aaWF0dg69vY2jbNoa2vW5mOwNwOvFWVuKeU0bqxo24CwtxFxXhLirEXViIMztbZjcTSaPjNvHOIWJtg8Tbhoi1DxJvHyLeNoiOHaeXnMuBw+tEeZ24clIILM0xgVJJAGfg9E46ohzKDI3zuYDZU3dSCCGEONpkwqWNWus7hy9orf+slPqa1vqjSin5KzqLbK3t5v13vUa238M9d26keJbUWAoPxPjDN7fT0zbEdX+9QoIlISZBWxYt//EfuAoKyP7wHWZnbAh2/970Ump4DZxeWHoTrP0glG0cd7iatjQx1UHgHcuxB70Mddn4LyxFx236XwH9RiEZ5RnM5r4AdiSCFQqZQtahEFaol2hNDYPbXmdo23aszk7AFMNOWbWK9GuvJWX1alKWL8eRlpbk1ovpRmuN1R0h1tSPjtsotxPlcaA8TpTbrB1ux8g2TvPbqWP2mF5FiZ5FEeuIfVZ/jPhwiNQ1dETNIWeGF1deKmnnFODKTcGR6h4JkBw+l3lcn7l8umY/E0IIIcTkTSZcalZKfQG4L3H5PUCrUsrJhKUGxUyz+XAXH7jrNfLSfdxz5wYKg7MjWIoMmmCpq3mA6/5qBaWLZCicEJPR89vfEtmzl6Kv/Q+OUBU8dy/suAfCIcieD1f9B6y8BVLH/52yw3EGNrfS/3IjVncEZ1YQq+kpwjseI/9vHsSVm4tyO+h/vhE0ZLx13rQZbmJOzruJ1tYSq6sj2tho6hnZFjpumbVlo604WDbatszaimMPDGKHQiZESoRJOhwe93HcZWX4L7jABElrVuOtrJSeSOKEDAdJ0YY+U7OosZ9YUz/2YHzydzL8lpvMf4xOhSsnBXdhGikrcnDnpeLKTTVhkhSsFkIIIaa0yYRLtwJfBh5KXH4psc8JvPvMNEtMJZuqO/ngzzdTkO7j3o9sJD/dl+wmnRWRoTh/+NYOOhv7ueZjyylbmp3sJgkx9dk21qFNtP/PV0kpSyN91ydgSzc43LDkraaX0twLJiyqHe8K0/9SIwNbWtERC8/cdDKuq8C3JJtobQ41N95L67/+GyXf/hbBa8pRStH3XANoTcaNlVMmYNLxOPH2dqJ19cTq64jW1hGtqyNaX0estu6Y+kY4nSb4cbnM2uk0s+ON7HeiHE4cqak4g0Hcc8rwBYM404M4g0GcwXScwSCOxD53USGubPnMEsenbW1mLhswi9UXJdY0QDQRJumhRJDkVLjzU0lZmoO72I+n2I/yOk2PpKh1xNoevhyz0FGTKimvc7Snkdd15OXhHkdu55T5HRZCCCHEiTluuKS17gA+qZQKmIu6f8zVB89Yy07CmNnikt2UGeOVQ5186OebKcrwce+dG8mbJcFSNBznj9/eTkddH1d/dBlzl0thYCHGZVvQshMOvwS1Zul4RWP1pVFwlRu16DqYez7Mv/K4BbZ7n6mn98+HQSlSVuQQuKAYT0lg5HpveTk5n/wE7f/7dXr/9GfSr7qS9KvnglL0PVtvejDddGYDJh2PE2tpId7WTrx9zNIxvN1BvL3dDEUbO2GGy4WnuNjUN1qz1sySVlaGp2wO7pJiHJ7TWwdGCDsSx+qOEO+JYHWHsUJREx4lQqSRQGkofuxsZ06FuyCN1OWjQZK7IA3lkp5vQgghhBjfZGaLWw78Ehgeu9ABvF9rvesMt+2kyWxxp8dLBzu44xebKc1M5Z47N5IbmB0ltmIRi0e+vZ2W6l6u+vBS5q3JS3aThJg6wiFo3AoNW6FhM9S9CpGQuS6rgohvFdXffI2M66+m8L/+d9J3G23oo+272/EtySbjrfNwBcf/vNHxOIff/R5ijY1k3Hwzgcsuxbt0KX1P1dP3dD2p6/LJfPv80xYwxbu7Gdq+naHtO0xB7F270IODR97I4cCVnY0rN9csecPrPNylpXjmzMFdUIBynfyMVEIcTcdt4h1DZumOYPWEj1iP9Dga5lA40lw409ymXpE/sU5zm31pbnO934MrJ0WCJCGEEEKMa6LZ4iYTLr0MfElr/Uzi8iXAf2itzzsD7TwtJFw6dc8faOfOX26hPCeNX314Azn+WRIsRS0e/c4Omqp6uOKOpcxfl5/sJgmRPFYc2nZDw5ZEoLQFOvaPXp+zEOacC3MugLnnowOF1N/5EYZ27GDeE49PeliWtmzavrMdqz9GwWfW4kh58xAmUl1Dy1e+wuDmzWBZuHJzSXvLpbjLLiVyUJG6Np/Md5x4wKQti8jBgwxt254IlLYTPXzYXOly4Vu0iJRVq/AtWogrL28kTHJmZpohbGLG0ZaNPRQfWfTwdnh0nz0YB0vjDHpwZnhxZvhwBr24MrwonxM1wRDQSbchESLFWgeJtQ4Qbx00M6h1HlnwWnmcODPN4zozfaYAdqZpjyvTh8PvliFnQgghhDhlE4VLk/kaNW04WALQWj+rlJLpZWawF6ra+fAvtzAv18+vP7yBrLTZMVwjHrV47Hs7aazq4fIPLJFgScw+VhzqXoaqP5sgqWk7xIfMdak5ULIOlr/LrIvXgC94xOH9zzzDwIsvkvfFL5xQvZ/+FxuJNQ+Qfdvi4wZLAN6Kcub8/GdYPT30P/88fU89Td8fH8EevB/vsrcB1xCtqyPnQ+twZWaMHKcti3hHJ/HWFjO0raWVWGsL8dY2Yi3NRPbuG6mF5MzKImX1aoLveDupq1bhW7YMR8rsmMhgNtGWjdUTId4VJt4dxuoKm+2uMFZ3GHvgOIWrXQ4cKS6UU2H1RsE+8gs75XWakCfDizNoFhzKDJnUgNZm9OTRl22N1R0m1npUiKTAlZ2CKz+VlOWjBa+dGV4cqa5TDrKEEEJMX5ZtcSh0iPL0ctxOd7Kbc8ridhynOvUvacTZM5meS78HXgfuTuy6DVirtX7bGW7bSZOeSydvf0sf7/j+y5RkpnDvnRvJnC3BUszi8R+8Qd2eLi67fTGLzi1MdpOEODusGNQ8B3v+APv+CIOd4PRA4UooXmeCpJJ1kDFnwiLcADoa5dANN6CcLioefgjlntw/NfGOIVq+8Tq+hZnkvG/JST8NOxJhcNMm+v7yFENVGs+cK4g1bELpHRCPEWtrI97WBpZ1xHHK48FVUIA7Lw/P/EpSV68mZdUq3KWl8s/MDKNtTbSul6E3Oog1D5gwKRQ5chYzhzK9fbJ8uLJ8ONO9OFJcJkBKrEcWnwvldhxx/3Z/1NQ4GrPEeyJYIbNtD8TGb5zC/H4l1kphej/lpeLON4srLxV3buoRjymEEEJorXmp6SW+vvXrVHVXEfQGuWLOFVxbfi1r89fiUNPj74bWmppQDS82vshLTS+xpWULlrYIeAKke9IJeoOke9JJ96ab9Zh9Gd4MMn2ZZPmyyPRl4nf75f+4M+hUei59CPgX4HeJyy8k9okZpqM/wod+vplUj5OffXD9rAmWYlGLx7+/k/q93bzltkUSLImZLx6BQ8/Anodh/2MQ7gGPHxZcBUtuhMrLwXNiHVS77r6bWG0dpT/+0aSDJa013b+vQjkVmTfOO4knMsrh9eK/6CL8F12Etm267tsCbMDuz0QPvETahg24CvJxFxTgyk+sCwpwZmTIPx8zmNaaWNMAgzvaGNrRYcIklwNPURreOemjIVKmD1e2CZNOduiYciic6V6c6V4om6A98USSNSZMkvefEEKIk7Wncw9f3/p1NjVvosRfwhfP+SI723fyaPWjPHjgQfJS87hm7jVcU3ENS7KWTLm/OQOxAV5tfpWXGl/ipcaXaBpoAqAiWMG7F76bFFcKvdFeeiO99EZ7CUVC1PfVm33RXmxtj3u/LoeLTG8mmT6zZHlN6JSXmsf8zPkszFxIXmreKb0eQ/EhGvoacConqe5U/G4/qe7UaRPmnQnH7bk0HUnPpRMXjlnc+uNX2dPcywMfPZcVJRnJbtJZEQ3HR4bCXfq+RSw+ryjZTRLizBjsMrO57XkY9j8B0T7wBmHRtbD4rTDvUnCf3GyQ8fZ2Dl19Danr11P6g+9P+riBLS10P1hFxtsq8W84/aFu77P19D5xmNRVuWS+e6HUm5lFYm2DDO5oZ2hHO/GOIXAofAsySV2Zi29JFg6vFFcXQggxfTX0NfDtbd/msZrHyPRm8tGVH+XdC949MhxuMDbIcw3P8VjNY7zY+CJxO86c9DlcW34t15RfQ3mwPCnttrVNVXfVSO+kba3biOs4qa5UNhZu5Pzi87mg+AKK/Mc/J7O1zUBsgFAkRCgSoivcRXekm+5wN13hLnoiPWZfuHtk6Yv1jRyf4c1gYeZCEzZlLWRh5kLmZczD4xztYKG1pnWwlcO9hzkcOkxNqGZkezgIO1qaO400VxppnrSRwMnv9rMsZxkfXv7hU38Rp4AT7rmklHqEYyenHaG1futpaptIMq01X/jtTl6v6+H7710ze4KloTh//O4OWg6FuPwDS1i4oSDZTRLi1MTC0FUNnQePXQY7zW1SsmDpTbDkJii/CFyn3kOx7f++gR2Nkv/FL0z6GKsvSs+jNXjmppO2/sz87qVfUgoaev90GFyO0zqLnJh64l1hBneaQCnWPAAKvBVBAheVkLIsG0fq9K8/IYQQYnbrCffwozd+xH377sOpnNy5/E4+uOyDBDyBI26X6k7lmvJruKb8GkKREH+p/QuP1TzGD3b8gO/v+D6LsxazMnclpYHSkaUkUILPdXJfNE4kbsfZ37WfLa1b2Nq6ldfbXieUmGV4YeZCbl96OxcUX8Cq3FUnXCfKoRwEPAECngAlgZJJHdMb7eVA1wH2d+/nQPcBDnQd4DcHfkPEigDgUi7mBudSFiijeaCZ2t5aBuOjswSnuFKYmz6XVXmruCl4E3MCc3AoB/2xfgZiAwzEBka2+6P9I5c7hzoJeoMTNWvGmLDnklLq4jc7UGv93Blp0SlQSt0A3FBZWXlnVVVVspszbXzrqSq+/uQBPnfVQv76LZXJbs5ZERmM8ci3d9BW28eVdyylcm1espskxImxLWjYDPsfh5Y3oLMKeuo54jsBfwFkV0L2PMiZDwUrYM754Dx9vTaG3niDw+96N1l3fIj8z31u0sd13rOXod2d5H96De7c1NPWnvGE/nyYvqfrSdtYSMaN86Zcl/CpTtsaqy+K0+9BOafOaxfvChOpCRGpDhGpCWF1hQHwlAVIWZlL6vJcnOmzY3i3EEKImS0cD/Prvb/mp2/8lIH4ADdV3sTHV36c/LQTm4CobbCNJ2qe4MnaJznUc+iInjwAeSl5lARKKA2UUpZeRmmglNyU3JEQx+/x43f7Jxz6FbWi7O7czdbWrWxp3cL2tu0MxMxkKWWBMtbmr2Vt/lrOLTqXvNSpcf5l2Ra1fbUjodP+rv009DdQmFZIebCcuelzmRucS3l6+SkPpZspJuq5JMPiZrlHdjTxyXu38fY1xfzvu1bOil+W8ECMP3xzO52N/Vx15zIqVuUmu0lCTE4sbIpv7/ujCZUG2sHhhvwlkD3fBEjDYVJ2JXgDx7/PU6C1pvbmW4g2NjLvicdx+v2TOm5oTyedv9xD+pVzSL90guI0p5HWmtDjh+l/vgH/BcUEryufFZ91J0rbmnjnEPG2QTPtfdugmfa+fRDiGuV24C5Mw13sx1MSwFPix5WbelZ6g2mtiXeGiSaCpEhNCKvHfMvoSHXhmRvEWxEkZUk2rqzT+62rEEIIkSwdQx08Wv0od++5m9bBVi4uuZhPr/k0lZmn3iFAa01PpIf6vvojloa+Bur76mkfap/wWL/bPxI0pXvS8Xv8DMYGeaPjjZFeQJUZlSNh0tr8tVMmTBKn7mSHxf0IeEJrHTvqugrgA8BhrfVdp7mt4izZVtfN3/5mB+vnZvKfb18+K062hvqiPPzN7XS3DHDNx5Yzd3lOspskxJsb6oaqJ02gVPUXiA2AJwDzr4BF15m1LzndbHsfeYShHTso/Pd/n3SwZIfj9Dx0EHdBKoGLJteF+VQppQheMxfiNv0vNqLcDoJXzT0rjz3V6JiN1WtmL4uHolhd4dEQqcOESMOcGV7c+al4KzNwZfmIdwwRbexncGsrA680A5jAqciPp9iPu8SsnelecCqUyzGp4EnbGnswhj0YH3dteij1YvdFAXD43XjLg3gvKsFbEcSVd3YCLiGEEOJsiFpRnmt4jocPPsyLjS9iaYvVeav5zwv/k/UF60/b4yilRgper8hdccz1g7FBGvob6BzqpD/WT3+0n95o75Hb0X76Y/20D7bjVE7eteBdrCtYx5q8NWT6Mk9bW8X08GZjI+4EPgN8QynVBbQDPmAucAj4jtb64TPeQnFGNPYMcecvt5Kf7uOH71uH1+VMdpPOuIFQhD98czuh9iGu+/gKypZkJ7tJQhwrHoHWXVC/GQ48DodfBDtuhritfA8svA7KLwSX96w3TcfjRGtriezfT/jAAXp+8yC+5csJvu2mSd9H6E+HsfqiZL9vCcp19mbTUEoRvL4CHbfpe6Ye5XKQftmZ7zV1Nmlbm+CoK0I8ZAIkqyexDkWwQlHsgdgxxzkzvbjz0/AuyMSdNzztfcqERa+1rYm3DxJt7CfW0E+0sZ+BzS3ol8eZsUVhfs5OhXI6UC4Fw2tLYw3G0UPxiZ+UQ+FM9+CtCJpAqSKIKzdlVnwZIoQQYvbQWrOncw8PHXyIxw8/TigSIi8lj/cvfT83zruRioyKs96mVHcqCzIXgGREYpImDJe01i3A54HPK6XmAoXAEHBAaz040XFi6uuPxLnj55uJxC3u+8gGstJmfk2K/u4ID39jG/3dYa7/6xWULMpKdpOEgHgU2vdC07bRpXUP2IkAIGcBnPdJWHQ9FK0Bx9kJY7TWxNvbiew/QOSAWcIHDhA9dAgdNb1HcDrxVlZS+JV/QU2yXZHDIQZebcZ/XhGe0jM7ZG88yqHIuKkSHbPpfbIW5Xactd5Tp8MR4VF3GKs7TLw7YtY9JkjCPnKou0px4Qp6cQY9eEoDONO9ODPMZWfQizPoxeE5sS8XlEPhzk/DnZ8Ga0ytB22NBk72YBxt2RC30ZZGWzqxbY/Z1uBQeFNdOFLdOFJdONPcI9vDa+V1SpAkhBBixmofbOeP1X/k4YMPcyh0CI/Dw2Vll3Fj5Y1sLNyI0zHzOwCImWNSVV211oeBw2e0JeKssGzN39y7jaq2fn72gfVU5p39E7yzra8rzEP/t42h3ig3fHIVRfMzkt0kMVt1HzY9kYaDpJZdkBiXji8DilabMKlotVkySv8/e/cdJ1V59n/8c6b32dleYRcWduldBQRErCj2EmON0ZgY0/wlUZMYS2JiEqPmiTHRxzxparArKHbBRpEO0tsCy/Y6vd+/P2ZZRIoL7DIsXG9f53XOtHOuQV1mv3Pf193jJSXDYSKbt6RGI21YnwqUNmwg0dbW+RxDbi7migrsE8ZjGTgQc0UFpn790Jm6HkyreJLWlzehd5txnVXa/W+kizSdhueygahEkvY529AMOhwTvnq523RKhuP4F9bi/2QXSf/eI490LhMGjwVTHyeGETnoPWYMHktHgHTowdHh0vQaxnw7xnz7UbmeEEII0V2iiSiheIhQPEQwHkwdx0Kd9+3edvcS0mt6dJquc9t9W6/ruB8dkUSEYDxIMBYkEAsQjKf2oXgodTsWxB/zs7V9K0mVZETOCH45/pecXXo2LpMrzX8iQhye7lsySPQKv52zjvfXN/CrC4cweeDx38ja2xTi1UeWEwnEuOAHI8nvd/wvASmOIREfbPsYtnyQ2lq2pO43OaFwJJz8rT1BkqcMenCEhlKKeG0t4Q0bOkYkbSC8fgPRqipIpqYzaVYr5gEDcJ55BuaBFZgHDsQ8cAAGz5GPh/bO3Um8IUTWN4agM6f3WzhNr5F5ZQXNcUXbrC1g0HCcVJDWmvYn4Y/i/7QG//waVCSBeaAH65BUw2q9x4LBbUYzHr2phUIIIURvoZTCG/XSFGqiMdRIY7Cx87gp2ERDqCF1O9i411LzPcGgGbAZbdiMNuwGe+rYYMNj8TC1ZCoz+s+gzF3WozUIcTRIuHQC+e9nO3jqk23cMKGUa8eXprucHrd7xFI0FOfCH40it698CyB6WDIBtSs6wqS5sHNRql+S0Qalk+Ckb0G/01LT3XpwiluirY3Ipk2EN24ksmkTkY2biGzaRNK3Z7lZY3Ex5ooKXOecjbmiEkvFQIwlJWj67g9+YvUBfPN2YhuZg7Xi2JiSqul1ZH29kub/rKXtlc1oBh320Ye2nG9PibdF8H9UnepjFE9iHZqN87QSTEVda5ouhBBCpEMimaAmUMN27/bOrTXcisPkwGly4jK5cJlcnce7l7d3mVzYjXZiyRiRRIRwPJzaJ8JE4nv2u+8LxAKdzaR9UV/ntrvZ9O7bCZXYp0arwUqONYdsazaVmZVMKpqEx+LBZrBhNVj3bEbr3rcNVix6CwpFUiVJqiQJldj7OJkkSerYordgM6QCJZP++G9BIgQcYrikaZoHKFFKreqhekQP2dYU4N5Za5g0IJtfnDco3eX0OH9rZM+IpR9KsCR6SKAZGtZAwzrYsRC2zoNQS+qx/OGpKW79T4eSk7utAbdKJkkGgyR9PhI+H0m/n+j2HaneSJs2Edm4kXhDQ+fzdS4X5gEDcJ1/HuYBA7BUVmIeOLDLq7sdcb3xJC0vbkJn1uM+/+g3ozwYzaAj65pBNP1rLa0vbCTRHsFxcgE6mzEt9cQag/g+rCa4vAEU2Ebl4pxSjDHXlpZ6hBBCiC+KJWL4Yqngpj5QT5W3ih3eHakgybednb6dxJN7FmmwG+1kWbLwx1Iri33xse5gM9hwmBydQVWOLYd+pn44janQKsOcQY4tFSTlWHPIseVgN8r0bSF6yleGS5qmzQMu6HjuUqBB07RPlVK393Bth0zTtBnAjPLy8nSXckxJJhV3vrQKk0HHQ5ePwKA/vqdRBNojvPrIMkK+KBd8fyR5pRIsiSMUDUDDemhYu2erXwuBPSEOjjwYeDb0n5YaneQ49Gmn8cZGwus3ENmwnsimTcRbW0n6A6kgye8n6fORDARAqX1eq5lMmMr7Yx8/HvPAAakpbQMGYMjLS1tDZKUUrS9uJLbTR+bVg9A7jr1v7jSjnqzrBtPy7Hq8b2/H+/5ObCNycIwvwFTc8z3pVDxJrDaA7+NqQqubQK/DflI+zsnFGDyWHr++EEKIE1MsEaMp1DE9rGOaWGOwEW/Uizfq3WtEkD/qxxfzEYqH9jmPWW+mxFlCf3d/ppZMpdRVSh9XH/q6+pJlyer8DKKUIpKIdI4w2r3ffRyIBTDqjFj0FswGc2qvN+85Npgx61K3nUYndpMdoy49XwYJIfZPU/v5JWWvJ2jacqXUKE3TbiI1aukeTdNWKaWGH50SD93YsWPVkiVL0l3GMeO/n+3grpdX8+Alw/jaScfX0ttfFvRGefXhZfhaI1zwvREUlGekuyTRGwWaYNO7sOmdVOPt1iqg42elwQq5lZA7uGMbBHlDUuFSF0McFY8T3baN8PoNhNevI7J+A+ENG0g0NXU+x5CfjyErC53Tid7pQOdwonM49hw7HeidTnQOJ8bCQkx9StAMx9ZMZ+972/G+twPXWX1xnX7s/+yJ1gYILKwhuKwBFUtiKnFiH1+AbVjOYfc2UkqRDMZJtISJt4SIt4SJN4c7bodJtEdAgWbW4xhfgGNiEXrnsRfCCSGE6FlKKZrDzVS1V9EebQdA6/gHQNP2Pt4tlogRUzFiiRjxZJxYMkYsuec4nowTSURoDjV3BkhNoSZawi371KDX9HtNV/vitDWnyYnD6Oi8L8eWQ19nX/Lseei04/uLayHE3jRNW6qUGvvl+7vym4hB07QC4Arg591emehR9d4wv5mzjvH9srhyXM+vPJVOIV+U1x5djq8lzAwJlsShUArq18DGt2Dj21C9GFCpwKjPKTDiKsjrCJM8pXCQZWGTwSDxpibiTc3Em5tI7D5uaiLe3ES8ppbI5s2oaBQAzWjENKAcx6RJWCorMFcOwlIxEH1GxlF56z0luKIB73s7sI3OxTm1d/zsMRXYMV08APe5ZQSW1hNYUEvr8xtpf2Mr9nH52E8u2O9oIpVQJNojxJv3hEfx5lBngKQie/d80DmMGDItmEtd6DMtGLKsWAdnobMeW+GgEEKI7hdLxNjp28m29m1s825jW/s2qrxVbGvfhi/q++oTHAa9pifLmkWONYdCRyEjckaQY8sh15pLji2nc8qYx+xBf5DPOEIIcTBd+SR7P/A28IlSarGmaf2ATT1bluguv3ztc6LxJL+9ZFjapsYcDWF/jNceXUF7Y4jzvzucwgFHvrqVOM7FQrDtoz2BkndX6v7CUagpdxDwFtI6ZwGxj2qB+R3bgSVDIeLNzajgflYc0TT0Hg+GrCwMubl4rr4ay6BKzBWVmPuVoRmPr2Hdkap2Wl7YiKnMjeeSAb3uZ4/OYsA5sQjH+EIiW9rwL6jF92E1vg+rsVRmYi5zE2/9wgik1jAkvjAKWK9hyLSkAqQydypA6tj0mRZ0JvngLoQQvU0imSCu4qmRQl8YGRRNRAnEAvhjfvxRf2rf0VQ6EAvsta/2V1Ptq96r0XSuNZcydxnTy6ZT5i6jzFWGx5L6HKs6Rk0rVOcAaoXiizNPjHojRl1qM+gMe+2NeiMGzSCBkRDiqPjKaXG9kUyLS3lzdS3feWYZd55byben9E93OT0mHIjx2qPLaa0Nct6twykZfGysRiWOQcEW2PAmrJsFWz+EeAiMdug/FQaejSqdivfjZTT/3z+IbNiAIScHy4jhXQpHNJMZQ3Y2+uwsDNk5GLKzUrezsjBkZh5zU9Z6Srw5RMPjK9BZjeR8ZwR6+/ERnMXbwgQW1hFYXEsyEEcz6zFkpUYdGbIsGDKt6LMsGLIs6F1mNF3vCtSEEKI3iyfj+/QJ+vIqYr6oL9U3KBbqnDrWuSUOcPyFECmpkodcl0VvwW60d04pK3AUUOYuo9RVSj93P/q6+uIwyUqgQoje5ZCnxWma9mc6M/J9KaW+3021iR7QHozxy1lrGFLo4qZTy9JdTo+JhOLM/p8VtNQGmP5tCZbEfgSaYP3rsPa11EilZBzcJTD6ulQD7tJTSYSitD3/Ai0/upZ4fT3mAeUU/OY3uM4/D51J+t90VTIYo+mfa0BB1g1DjptgCcCQYcF9TimuM/qQjCTQ2Qy9bkSWEEL0Zl/sSVTlraKqvYpt3m1UtVexy79rv8vO76bX9J29giwGCyadqXNkj8PowGg2YtKb9oz42c/on/2NENp97DA6cJgcnXun0YndaMeoP37+HhRCiK9ysK/Sdw/9mQgMBp7ruH05sLYnixJH7oE5a2kJRPnHDeOO29Xhoh3BUlO1n3NuGUbfoVnpLkkcK3x1sG52KlDa/imoJHjKYPxtMPhCKBwFmkasro6Wh/+HtueeIxkIYDv5ZAp+dT/2SZMkODhEKpGk+Zl1xFvC5HxzGMZsa7pL6hGaQYfecHz+TBVCiCPxya5PWFa/rHPETzQR3e9xLBEjoRKYdCZM+tRm1KXCHbPe3Hls0pvQ0Kj2VXeGSb7Ynp5EZr2ZPq4+VGRWcHbp2eTYclIBknHfZtRWg1X+XhdCiB52wHBJKfUvAE3TvgOcqpSKd9z+G/Dx0SlPHI5PNzfx/JJqvj2lP0OL3Okup0dEw3Fef2wljdt9nP2toZQNz053SSKdkkloXA/bPkwFSjsWAgqyB8Kk/5cKlPKGgqahkknCa9fS+u9/0/7GHFAK19lnk3njjViHDkn3O+mVlFK0vrKZyJZ2PJcPxNzv+Py5I4QQYl/NoWYe/OxB3qp6C52mS40K+sIony+GR7vv02k6AvEAbZE2ooko0WSUSCJCLBEjmox2hlEAubZcylxlTO83nVJXKaXuUsrcZRTYC2SVMiGEOIZ0pQmIB3ABu9erdHTcJ45BoWiCu15eTWmWjR+eMSDd5fSIRCLJW0+spm6bl7O+OYR+I3PSXZI42qJBqFkGOxbAjkVQ/RmEU8v2kjsETrsrFSjlVhJvaiK0ajWh5/6H8MpVhD7/nKTXi2azkXn11/Fcex2m4qL0vp9ezv9RNcEl9ThPL8E+Ji/d5QghhDgKlFK8se0NfvfZ7/DH/Hx35Hf55tBvdttUsKRKklAJjDqZWiaEEL1BV8KlB4HlmqbNBTRgMnBvTxYlDt8j721kR0uQ/958Chbj8bcyhFKKeU+vZ+e6Vk6/bhDlY3LTXZI4Gnz1sHNhKkjauRBqV6Z6JwFkV6SCpJJTSOaNIlwTTIVJrz5BeNUqYjU1qefp9ZgHDsR17rlYhw/DecYZ6N0ywuZIhT5vov3NKqzDs3Gd0Tfd5QghhDgK6gJ1/Grhr/io+iOGZw/nvgn3Ue4p79Zr6DSdjEwSQohe5CvDJaXUPzRNexM4ueOuO5RSdT1bljgcq6vbeerjrVx1Ugnj+x+f/YcWv1HF+gV1jDu/jEETCtJdjugpyWRqZNKGObB+DjSuS92vN0PRaBh/G4nMEYR9TsLbdhH+ZC2RdTOJbP0tJFINPY1FRVhHjsBz7bVYhw/DMngwOuvx2QcoXaI7fbQ8twFTHyeZl1fICmlCCHGcU0rx4qYXeXjJw8STcX4y9idcPehqWepeCCFEl0YuAeiBxo7nD9Q0baBS6qOeK+vwaJo2A5hRXt6935z0BrFEkp++tIpsh5k7zx2U7nJ6xLr5tSx+fRuV4/MZd15pussR3S0Wgq0fpgKljW+Bvx40ParPeOKjf0I4nEO4PkJ42UYiT39CrOb5zpca8vKwDBqE88wzsQwbhnX4cAxZx2fAmm5KKeL1QYKrmwgsrEXnMJJ13WA0o3y7LIQQx7Od3p3cu+BePqv7jJPyT+Le8fdS4ipJd1lCCCGOEV8ZLmma9jvgSmANkOy4WwHHXLiklJoNzB47duzN6a7laHvyo62sq/Xyt2vG4LYef3PTd6xtZt7T6ykZ5OG0ayplxY/jhb8RNr2dGp205QNUNEQ07CJsHE44OolIQ5TwW1tItD7T+RJTaSnWkSPIuOprWAYNxjKoUoKkHqaUIlYTILS6idDnTcSbQqCBucxNxkXl6B2mdJcohBCihySSCZ5e9zSPLX8Mg87APePv4dIBl8pnMSGEEHvpysili4AKpVSkh2sRh2lLo58/vb+Jc4fmc87Q/HSX0+2aqn289eTneArsnPOtYej1MkKiV2utgnWvk1j5GpHPVxBuNRAOZBAJlhKpC6BicWArmqka84ABOKadjqWiEsvgQZgrKtE77Ol+BycEpRSxaj/BjkAp0RIGHZj7ZeCYVIR1cBZ6p4RKQgjRGySSCcKJMKF4iFAsRDAeJBQP4Y/58Uf9+GI+fFFf6jjq2+v+ukAdu/y7mFI8hV+c8gvy7cffZ00hhBBHrivh0lbACEi4dAxKJhV3vbwai0HHfRcef8uo+1vDvP7YKkwWA+ffNhyTtaszOcUxQylo3EBs/kxCH84huLmWYJOJSJsJVDYA+owMzIMq8ZwxCMugSsyVlZjLytCMx98ovGONSiqSwRgJb5SEL0rSGyVWFyD0eTOJ9gjoNMzlGbimlmAZnIXeLv9OhBAiHZRS+GN+WsOttIRbaAm30BpupTXSuuc43Ep7pL0zPNq9RRJd+xiv03Q4jA6cJicOowOHycEAzwC+P+r7nFt2roxWEkIIcUBd+U09CKzQNO19vhAwKaW+32NViS57bO5mPtvWwu8vHU6u05LucrpVJBTn9cdWEg3HueTHY3B4jq/3dzxT8TiR+a8TfO9FQstXENwVIR5M/bjRTBlYhw0h++QJWIalGm0bcnPlA2sPSnijRHd6iTWGSHqjJLyRVJjUESiRUHu/QK9hGeDBdVZfrIMy0dkkUBJCiCOllCIUD+GNevFFfXijXrwRL/6YH2/Uiz/qxx9LjRzaPXroi8ftkXZiydh+z201WMm0ZOIxe3Bb3BQYCrAarFgNVmwGG1aDFYvB0nnf7u2LIZLT5MRmsMnfx0IIIQ5LV8KlWR2bOMZ8sqmJR97byEUjC7l8bHG6y+lWiXiSt55YTWttkPNvG0F2sSPdJYmDiDc2Elq9mvD8dwktmU9oSwO7P/8aHHqsQwZhm3QW1vGnYamskBFJPSgZSRCt9hGr9hHdmdoS7dHOxzWLHr3LhN5lxlzmRu8yoeu4nbrfhN5pQjPI9FMhhDiQaCJKW6SN1nBrah9ppS28994b9eKLdIRIHVs8GT/oeS16SyrwMTlwGp04TU4KHYU4jA7cZncqQLJ48Jg9ZFozyTSnblsM8gWcEEKI9PrKcEkp9S9N00zAwI67Niil9v+1iThq6trD/GDmcspzHDxw8bDj6lsmpRTznl5P9fpWTr9uECWDM9NdkviChM9H+PPPCa3+nPDq1YRWLife0JR6UFOYXQlcw3KxnXIq1nOuwThg6HH13+exIhlNkPTHSPhT09iiO1JBUrwhmFpyAdBnWjCVujGVODGVODHm29GZZbloIYRQStEeaac53ExzqJn2aDuBWIBALIA/6t9zHPN37oOxIN6ol7ZIG4FY4IDndhqdZFgycJlcuEwuChwFuEwunCZn6j6zq/Ox3ffvHkFk1MuXL0IIIXqnrqwWdxrwL6AK0IASTdOuV0odc6vFnShiiSS3PbuMUCzBX68Zjd18fPUhWvz6NtYvrGPc+WUMmlCQ7nJOaKmmztUEFi4ktGQJoVWriW7b1vm4McOAzeXDMjKKddBALNOuQjfmCrB60lh176WSiqQ/SrwlTLw1QtIXJRmIkfDHOvZRkh3HKpbc67U6mwFjsRPr0OzOMEn6IwkhThTRRLRzmll7tB1vJDVSqCXc0hkgNYebaQm10BxqpiXcQlwdeBSRSWfCYXJgN9o7t1xbLmXuMjItmWSYM/BYPPvs3WY3Rp387BVCCHHi6Uoq8UfgLKXUBgBN0wYC/wXG9GRh4sB+/9Z6lmxv5X+uGkV5rjPd5XSrtZ/WsPiNKirH5zPuvNJ0l3NCitXXE1y0iMDCRQQXLiRWUwOAPisLa3kh7v59sCTXYHX70eeXwojvwPArILMsvYX3EslwnHhLmERrOBUitYRJdOzjrRGI7x0aodfQO4zoHCZ0diPGHBs6hzF1n92EzmHEmG1Fn2WREWJCiF6jPdLOxtaNbGzdyKbWTWxs3UiNvwa9To9RZ8SoM2LQGfY5NugN6DU9/qi/M0zyRr2EE+EDXsuoM5JlzSLLkkWOLYeKzAqyLFmd92VZs8gwZ2A32nEYU4GSjCASQgghDk1XwiXj7mAJQCm1UdM0+Rs3Td76vJb//Xgb143vywUjCtNdTrdRSrHi3Z3Mf3kzJYM8nHZNpfyifJTEW1sJLvqMwKKFBBcu6hyZpHe7sY0dTeZ547C7GzC1foIWWA2WDBh6OYy4CorHgfx7OiClFInWCJFt7USrvESq2ok3hvZ6jmbWY8i0YMy1YanMxJBpQZ9pweCxoHeZ0Mx6+X9BCNEr7W5gvcu/qzNI2r01BBs6n5dhzqDCU8FpJaehUMQSMeLJOLHknv3uLRgPEk/GcZgc9HX13TO9zOzCbXLvPeXM7MJj8eA0OuXnqBBCCNHDuhIuLdE07Sng6Y7bVwNLeq4kcSBVTQF+8sIqRhS7+fl5g9JdTrdJJhWfPLeR1R/uov/oXM74xiD0emkmfCSSwSCxmhriLS0kWlpJtLZ86biVREsL8dYWEo2pfkk6mw3r2LFknDUee24Ac3g5WvVM8CUg6oJ+p8Gwy2Hg2WAwp/cNHqNUUhFvDBLZlgqSotvaO5tpaxYD5lIXttG5GLKtGDwWDJkWNKtBfukRQhxzlFJEEhECsQDBWJBAPNDZhygYC3b2IWqPtO/VsHqvBtYR715Tzww6A/3d/Tkp/yQGegZ2btnWbPk5KIQQQvRyXQmXvgN8F/h+x+2Pgcd7rCKxX+FYglufWYZOp/HY10djNhwfTXljkQTv/H0NVauaGHlmHyZc3B9NJx8wD1dk2zZa//M0ba++igoG93lc53Jh8HjQZ2ZiLC7GMnwYptxMbAVJrGodWtV70N4E7UDBSDj1R1B+BhSPBZkiAKR+4UoGYiS8URLtERLtURLeCLG6INGqdpLB1C9SOqcJc5kLc5kbU6kbY55N/tsWQhwzEskENYEatnu3U9VeRZW3iu3e7ez07cQb9RKMBUmoxFeeR6fp9jSq/lID692jh3JtuVR4Kih1l0o/IiGEEOI41ZVwyQD8SSn1MICmaXpAhi0cZffOWsPaWi//d8NYSjJt6S6nWwS9Ud74y0oad/iYdOVAhk8tTndJvZJSisCn82n5z78JfPgRmtGIa/p07JMmYcjKRJ+Zid7jweDxoBk7PtSH2mDtq7ByJuxYAC2ALRvKp6XCpH5TwZGTxneVXslwnFhdgFhtgHhrOBUgtUdSgZI3AnG19ws0MGRasAzK6gyU9JnSA0kIkT5KKXwxHw2BBhpCDdQF6lIBUvt2tnu3s8O3g1hyz+K/TqOTUncpI3JG4Da7O5tY2wy2PcfGjmND6thpcmI32tFpMtpYCCGEONF1JVx6HzgD8HfctgLvABN6qiixtxeW7GTm4p18d2p/Tq/MS3c53aK1LsDrj60k2B7lnFuG0W/kiRtkHK5kKET7a7No+c9/iG7Zgj47m+zbbsPztSsxZGfv+4JEDDa+DSv/C+vnQCIC2RUw9Rcw4EzIHw66E+sXBJVUxJtDxGoDnWFSrDZAoi2y50kGDb3LjN5tSq3A5s5G7zZ13qd3m9E7TGh6CZKEED1n9zQ1f8yPL+ojEAvgi/poDbfSGGqkIdhAY7CR+mA9jaFGGoON+zS5NuqM9HH2oa+rL5NLJlPmKqOvqy99XX3JtGRKIC6EEEKIw9aVcMmilNodLKGU8muadkwOndE0bQYwo7y8PN2ldJt1tV7ufu1zxvfL4kdnDEx3Od2iZnMbc/66Cp1O46LbR5NX5kp3Sb1KrKaG1mefpfWFF0m2t2MZPJiCB3+La/p0dCbT3k9WCupWpwKl1S9AoBGsmTDmBhjxNSgcdcI05FZKkWgJE9nmJbrDS7TGT7w+iIp1rM6mA0O2DVNfF8aT7RgL7BjzbejdZvmFSwjRbZRSBGIBWiOttIXbUvtIG63h1L4t0kZbuC3Vvyjqwx/z44/68cV8xJPxA57XarCSa8slx5rD0Oyh5FpzybHlkGfLI8eWQ64tl0J7IXrd8TGtXgghhBDHlq6ESwFN00YrpZYBaJo2Bgh9xWvSQik1G5g9duzYm9NdS3fwhWPc+swyXBYjf7pqJIbjoMn15qUNvPePtTizLJx/2wjcOdZ0l3TMS0ajRNavJ7RiJcHFn+H7YC4ohfOMM8i8/jqso0fvG354a1Nh0sqZ0LAGdEaoOAdGfD017c1g2v/FjiMqqYjVBTpXaYts85L0dTTXthowFTmwn1yAMb8jSMq1oRl7//9jQoj0iSQiNAQaqAvWUR+spz5Qv9e+IdhAa6T1gCGRXtOTYc4gw5yB2+wmx5ZDmbEMp8mJw+jAYXLgNDpT+477MswZ5NhycBgdEoQLIYQQIm26Ei79EHhB07QaQAPygSt7siiR+mbzjpdWsaMlyLM3nUyu05Luko6IUooV7+5k/subKejvZvp3hmNxSFPPL1NKEauuJrRyFaGVKwmtWklk7TpULNUXw5CbS+b115N59dcxFhXt/eKmTbD+dVj3OuzqWNCxaCyc90cYcgnYMo/yuzl6VCxJIhAj0RomUuUlWtVOZLsXFU41o9W7TZj7uVP9kErdGHKlubYQouuSKklLuKVz6llDqGHPcTB1XB+spy3Sts9rnSYnebY88ux5VGRWkGnJ7AyQPBZPam/2kGHJkIBICCGEEL3WV4ZLSqnFmqZVAhUdd21QSsUO9hpx5F5cWs2c1XXceW4lJ/fLSnc5R0QpxcfPb2L13Gr6j87ljG8MwmCUYfkAKpkk/PnnBObPJ7RiJaFVq0i0tACgWa1YhwzBc921WIePwDpiOMb8/D0vTiahZlkqUFr/BjRtTN1fOApO/wUMvgiyBxz9N9XNYk0hoju8JAMxkv4YiUBsn2MV2XtFI0OuFdvwHExlbsylLgye3h3OCiG6jy/qS007i6WmnX1x2z0Vbfe2O1BqDjUTV3uPNtLQyLRkkmvLJd+ez4icEeTZ8zqDpDxbarMZj8lOAkIIIYQQ3eorw6WO/kq3A32VUjdrmjZA07QKpdTrPV/eieu84QX4wnFumFCa7lKO2LK3t7N6bjUjzihh4iXlJ/yIkWQoRGDBAvxz5+KbN49EYxMApv79cUyZgnVEKkgyDxiAZvjS/6LxKFR9nAqTNswBXy1oeig9FcbdDJXTwd37V91LhuIEVzUSXFpPdIdvzwM6DZ3diN5hRGc3Ysq0dB7r7Eb0LhOmPi70dhkVJ8SJKKmSNIeaqQnUUOuvpSZQQ42/hrpAXed9/pj/gK/XaTocxtSUM5fJhdvs5uSCk/f0LbLmpvoa2XLIsmZh1MnPGiGEEEII6Nq0uH8AS4HxHbd3AS8AEi71IJvJwI2nlqW7jCO2Y00zC1/byoCxuUy8tPyEHe4fq6/HP3ce/rlzCSxciIpE0Nnt2CdPwjl1KvZJkzB4PPt/cTwK2z6Ez19OhUqRdjDaUr2TKs+HgWeB9QCv7UVUUhHZ1EpgWQOhNU0QVxhybbjPLcUyKAu904Rm0Z+w/w0JcaJSSuGNemkJt9ASbqE51Jzah5tpCXXswy00hZqoC9QRS+49uNppclJgL6DIXsTYvLEU2gvJtGbiNDpxmpydQZLT5MRmtKHTpPeaEEIIIcSh6kq41F8pdaWmaVcBKKWCmvx2J7qgvTHEO39fQ1ahg6nXDjqhQgGVSBBeuxb/hx/hnzuX8Jo1ABiLi8m44gqcU0/DNnYs2pdXd9stEU8FSmtegXWzIdwGZjdUngeDL4R+U8B4fDRDj9UHCCxrILi8gaQ3imY1YB+Xj310HsZi6T8ixPFCKUVcxYkmokQSEfxRf2dg1BpupTXSSnOomdZIKy2hltS+47EvB0aQmpaWYc4gy5pFpiWToVlDOaPPGRQ4Cii0F3buHSZHGt6tEEIIIcSJpSvhUlTTNCugADRN6w9EerQq0evFognefGI1AOd+eyhG8/HfYylWU0Ng/nz8n35KcP4CEu3toGlYR44k5/bbcU49DVP5QUZvJRNQ9UlHoDQLgs1gcqamug25BPpPBYP5qL6nnqCSilhtgMjWNoIrG4lV+0EHlopMbDPysA7KRDPIyAEhjnXBWJBqfzU7vTvZ4dvBDt8Odvp24ov6OgOkSDxCJBnpvJ1UyYOe02aw4bF4yLRkkmfLozKzEo/FQ5YlqzNE2n2cYc7AoOvKxxghhBBCCNHTuvKp7B7gLaBE07RngInADT1ZlOjdlFLM/c96mnf5Of+2Ebhzjs9mpslAgMDixQQ+nU/g00+Jbt0KpFZ0c5x+OvaJE7FPGI8h8ytWaWtYD4ufgrWvQaABjHaoOCcVKJWfAcbe3YxaJZJEd/mJbmsnss1LpKq9cxU3Y74d93n9sI3MQe88wCguIUTaBGIBtnu3p4Kj3SGSNxUiNYYa93qux+yhxFlCtjUbs97cuZn0pr32u4/tRjses4dMayaZ5kw8Fg8WQ+/+eSeEEEIIcaLqympx72qatgw4BdCAHyilmnq8MtFrrfqgmk2L6zn5gn70HdK7V7r7slhtLd45c/B/+BHB5cshFkOzWLCNG0fGFZfjmDjx4KOTvqh6KXzycGq1N4MFBp4NQy6GAWeDqfcGciqWJLrTR2RbO5Ft7US3e1Gx1GgFQ44V24gczGVuTGVuDO7ePxJLiN4uHA93hkbbvds7tx2+HTSF9v7rPseaQ4mzhIlFE+nj7EOJqyS1d5bgNDnT9A6EEEIIIUS6HTBc0jStL9CmlGpXSjVrmhYELgIGapr2mFIqerSKFL3Hrg2tfPrSZspGZDPmnL7pLqdbJLxevG+/jXf26wQXLwalMFdWknX9ddgnTsQ6ejQ6cxdDEqVSvZQ+/iNs+wgsbphyB5x0C9h7ZxCXCMSIbvcS2e4lWuUlussHcQUaGPPs2MflYypzYS5zo3fI6CQhjpakSnY2um4MNqb2oca9jusCddQH6/d6XaYlk1JXKacWnUpfV1/6uvp2Bkg2Y+8NvoUQQgghRM852Mil54GLgXZN00aSWiHut8AI4HHgph6vTvQq/tYwbz/1Oe4cK2fcMBhN13sbMSejUfzz5uGd/Tr+efNQsRim0lKyb/su7vPPx9T3EIOzZBI2vAEfPww1y8CRD2f+CsZ+A8y959t+pRTxphDRqo4wabuXeGMo9aBew1TkwDGhEHOpG3OpC51NlukW4kgkVZJdvl1sbNvIlrYttEXaOvsXRRPRvY4jiQiRRIRYMoY34qU53ExCJfY5p9PkJMeaQ441h5PyT6LEVUKpq5Q+rj70dfaVBthCCCGEEOKQHSxcsiqlajqOrwH+Tyn1R03TdMCKHq9M9CqJWJI3n/iceDTJRbcPw2TtfU1WVTJJcMkSvLNn4337HZJeL/rsbDKu+hruGTOwDB166CuXJWKw+kX45BFo2gCeUjj/URhxVa/opZQMx4lW+4lW+4ju8BHd7iUZSK3apLMZMPVxYRuTh7nUhanIiWaURtxCHA6lFM3hZja1bkptbZvY3LqZLe1bCMVDnc+zG+2Y9WaMOuO+/YwMZlxmFyZdqp9Rji2HbGt2KkiypcKkbGu29DUSQgghhBDd7mAJwBd/iz4duAtAKZWUpcHFl300cwMNVV7OvWUYmQX2dJdzSKI7dtD2yiu0v/oa8dpaNJsN15ln4Dp/Bvbxp6AZDjEoi4WgejFs+xhWzoT2HZA7BC79Owy+CPSHF7yF1rfQ+tJGNL0OQ64NY441tc+1Yci1obcf2SghlUgSqwsS3enr3OKNwY51IsGQbcVSmYm5rwtTqQtDtrVXj04T4mjzR/3UBmqpC9RRF6yj1l9LfbCeGn8NW9q20Bpp7XxuliWLck85lw64lAGeAQzIGED/jP4yLU0IIYQQQhyTDvZb7geapj0P1AIe4AMATdMKAOm3JDqt+XgXaz+tZcw5fek3Kifd5XRJMhTC9847tL30MsHPPgOdDvuwUnIvuwTnGWehKxoE9hzoSpAaj6TCpKpPUoFS9WJIREDTQZ8JMP0PqWbdhxnKKqXwf1JD+5ytGPPsGPJtxBuCBLa1dzbKhtRIos6wKceGzmpI9XhSqXN0HidT+923E95oKkza5Yd46nw6uwFTiQvbiBxMJU5MxQ6Z4ibEQSilaAm3sMu/a6+tLlDXuflj/r1eo9f05NhyKLAXcHqf0xngGUB5RjkDPAPItHzFKpNCCCGEEEIcQzSl1P4fSA1PuhIoAJ5XSu3quH8UkKuUevuoVXmIxo4dq5YsWZLuMk4IdVvbeeWPyyiu8HDebSPQHcMjWZRShFeupO2ll/HOmUMyEMDYpw8Zl1yCu68f46L7936B0Q6Z/SCzFDxlHcdlqWNvDVR9nGrKXb0Y4mFAg4LhUDoJyiZDn/FgcR1ZzYkkba9tIfBZHZYhWWReWYHOpE89llQk2iLEGoPEG0LEG4PEGoLEG4Ikg/GuX8Sgw1TkSIVIHZveYz70KYBCHMeiiWhnc+z6QD3V/uo9IZJvFzWBmr2mrwF4zB7y7fkU2AvIt+fvc5xtzcag631TiIUQQgghxIlL07SlSqmxX77/gJ9qVSp1mrmf+5d3c22ilwq0R3jridU4PGbO/OaQYzZYijc10f7aLNpefpnoli1oViuus88m49JLsI4di9a8Gf42CcrPhHMehNZt0LINWramtsYNsPFtSHx5wJ4G+UNh7I2pQKnvBLBmdFvdyWCM5qfXEdnajvO0Elxn9d1rGpqm0zBkWjBkWqBi79cmAjFUJAE6QNNSg6Y0LTXZdfdtnZY6NujQ9MfmvzshelokEaHGX0ONv4aGYAPN4WaaQ800hZpoDnfsQ814o959XuswOihyFNHX1ZcJRRMochRR7CimyFFEoaNQprAJIYQQQogThnxlKg5LNBTn9cdWEgnFufR7Y7AcYb+f7pbw+/G99x7eN+YQmD8fEgmso0ZR8Otf4TznXPSOjr5QiTi8ckuqufaFj4EzH7LL9z1hMpEardSyNRU+2bKg70Sw9czUlVhjkOZ/rSXeGsZz+UDsY/IO6fV6uxGOsX8nQqRDLBGjNlDbOcqoxl+z13FjqHGf1ziMDrKsWam+RxnlnFJwClmWLLKt2WRZs8ix5VDsKMZlcskIPyGEEEIIIZBwSRyGRCzJnL+tpmVXgOnfHU52sTPdJQGpPkr+Dz/E+8Yb+D/8CBWNYiwsJOvGb+C++GLM/frt+6JPHoFdS+Gyf6SCpQPR6SGjJLUxpcfeA0B4cyvNT69H02vk3DwMc6m7R68nRG+mlKI90s5O306q/dVU+6r3Oq4L1KHYM/3boBnIt+dT5Cji1KJTO0cZFTmKyLPnkWXJktXUhBBCCCGEOETHVbikadoMYEZ5+X5GnohuoZKK9/61ll0bWpl2wyD6DslKbz3RKP5PP8U75038779PMhhEn5NNxpVX4pp+LtaRIw88sqBmOXz4IAy7HIZecnQLPwD/wlraZm3GkGMj+/ohqSlvQpzglFK0RlrZ7t1OVXsV273b2eHbkQqRfNX7NMrOtmZT4ixhbN5Yip2paWq7txxbjvQ5EkIIIYQQopsdsKF35xM0bSJwL9CXVBilkWrJtJ9hIMcGaejdM5RSfPLCJlZ9UM34i/sz+uy+6akjHie4eDHeOXPwvvMuyfZ2dG43rrPOxHXeedjGjUPT6w9+klgInpgCES/cugCsnqNT/AGohKL9ja3459dgqfCQeVUlOov8AixODEoposko/qifxlAjVd4qtrdvZ7s3tW3zbsMX9XU+36AzUOwopsRZQomzhGJncedt6XUkhBBCCCFEzznkht5f8HfgR8BSINHdhYneY/k7O1j1QTUjTi9h1Fl9juq1VTJJcMkSvG++ie+dd9FnnYwuowj75Cm4p5+DY+JENJOp6yf84NfQtAGueTntwVK8JUzrq5uJbGzFMbEQ93n99mrcLURvE01EqQvU7dXjqC3Shj/mJxAL4I927GN79vHkvisc5tvz6evqy/Sy6fR19aXUVUqpq5QCR4GMPhJCCCGEEOIY0pVP5+1KqTd7vBJxTFu/sJYFr2xhwNhcJl5WflSa2KpkktCKlalA6a23iDc2olntOKb9EAypUVPOqSU4p5Ye2om3fQwL/gLjboLyad1ed1ckI3FCq5sILK0nus0LOo2Mi8txnFyQlnqEOFS+qI+1zWup9lWnQqRATWeQ1Bhs3KvPkV7T4za7cRgd2I12HCYHBY6CPbeNDhym1HGmJZNSVyl9XH2wGqxpfIdCCCGEEEKIrupKuDRX07Q/AC8Dkd13KqWW9VhV4piyfU0zc/+9nuJKD9OuH9yjo2qUUoQ//xzvnDfxvvUW8dpaNJMJ++RJOM88l2htIdEqP66z+xJvDuObtxNzPzeWAV0cfRT2wqu3QmY/OPP+Hnsf+6OSisjWNoJLGwh93oSKJTFkW3Gd1Rfb6FwMGdJf6XjXGGxkVeMqxheO71VTt+LJOJvbNrOqcRWrGlexumk1W9u3dj6u1/Tk2/MpdBQyvmB8Z5Ps3Y2yc225MtJICCGEEEKI41hXPu2f3LH/4pw6BZze/eWIY039Ni9vPbGazCI7594yDL1R1yPXSfh8tL/yKq3PPku0qgqMRhwTJuD64Q9wTJuGihto+sca4k0BPFdWYB+VSzKaILrDS8tzG8j7wWj0zi5Mi3vrLvBWw43vgMl+yHVGd/lpfWkjCW8UQ6YFQ5YVfaYFQ5al87bOYdxrZFesKURwaT3BZQ0k2iNoFj22UbnYxuRh6uOUpcxPAP6on3+s+Qf/WfsfQvEQbrObr1d+nasqr8JjSe+0zC9TSlEfrGd10+rOMGldyzpC8RAAHrOH4TnDmV42nWHZwyh1l0p4JIQQQgghxAnuKxt690bS0Lt7tNUHeekPSzFZ9FzykzHY3eZuv0ZkyxZan3mG9ldfIxkMYh0xgowrLsd5xhno3W4gFeg0/XMNKpYg65rBWMozOl8fqwtQ/9gKzGUusr8x9OCjqta/ATO/DpN+DNPuPqQ6VVLh+6ga77vb0dmNWAZ6SLSEibeESbRH+MIMIDSTDkOmBX2mlaQ/SnSHDzQwD/BgH5OHdXAmmvErGo6L40I0EeX5Dc/z5KonaY20ck7pOUwvm87Lm19m3s55WA1WLhlwCdcNvo5CR+EhnbvaV83cnXP5sPpDEslEajU0ZxHFjtTqaMXOYrKt2ei0/QfC4Xg4tfqat4qq9qrO/XbvdnyxVPNso87IoMxBDM8ZzrDsYQzLGUaxo1gCUSGEEEIIIU5QB2rofcBwSdO0a5RST2uadvv+HldKPdzNNXYbCZeOXKA9wku/X0o8muCSH48hI6/7pvCoRAL/vHm0PP00wQUL0UwmXNOn47n6aqzDhu713PCGFpqfWY/OaiD7G0Mw5u872si/qJa2VzbjPrcU55SS/V/U3wiPnwKuQrjpfTB0vfl3vDVMy/MbiG7zYh2WjeficnQ24573E08Sbw0Tbw6nAqfmEPGW1G1Nr2EbmYNtVC56V/eHc+LYlFRJ5mybw2PLH2OXfxcn55/Mj8b8iCHZQzqfs6VtC//3+f8xZ+scFIpzy87lG0O/wUDPwP2eUynFupZ1zN05lw92fMDG1o0A9Hf3x2lypnodhRr3eo1JZ0pNTesInQw6Q2eQVOOv2asvUp4tj1J3qmF2P3c/hmUPoyKzApP+EBrlCyGEEEIIIY5rhxMu3aKUekLTtHv297hS6r5urrHbSLh0ZKKhOK88vIy2hhAX3z6K3L6ubjlvvLWV9pdeovXZ/xKrqcFQUIDna18j4/LLMGRm7vP8wOI6Wl/ZhDHPTvY3hhwwnFFK0fLsekJrmsn59nDMfVxffgI8dw1sehdu+RByB3WpXqUUoRWNtL66GYCMC/pjG50rozbEASmlmF8zn0eWPsKG1g1UZlbyo9E/Ynzh+AP+d1MXqONfa/7FS5teIhQPMbl4Mt8c+k1G540mloyxrH4ZH+z4gLk751IbqEVDY1TuKE7vczpTS6bSx7Vn5cZwPExNoIZdvl3s8u/ZdjfdjifjnQFSqbuUMlcZfV196evq26t6QAkhhBBCCCHS45DDpd5MwqXDp5Rizl9Xs+PzZs777nD6DMk64nPG6upo+svjtM+ahYpEsJ10Ep5rrsZ5+ulohn37tCil8L67Hd8HOzEP9JB1dSU688H7uSRDcer/ZxkoyPvBaHTWLzx/xbPw6nfgrF/DhO91qeZkMEbra1sIrWzE1NdF5pUVGDKl4bY4sM+bPufRpY+yqG4RRY4ivj/q+5xTds4Bp6V9WVu4jf9u+C/PrnuWtkgbFZ4KagI1+KI+zHoz4wvHc3rJ6UwunkyW9cj/vxRCCCGEEEKIQyXhkuiS1fOq+WjmRk69fAAjph1gilkXJcNhWv75T5qeeBISCdwXX4zn6q9jGbj/aT+QmmLW+tImgssbsI3Nw3NxOZq+a7+cR3Z4afzbKqyDM8m8elBqpEjdavjHdMgfBtfPBt1X9zoKb2mj9fkNJHwxXGf2wTmlpEdXyDsRKaVYUr+ExmAjbrN7r81hdHQ5kEmHpEpS469hS9sWNrdt7tyva1mHx+zhlhG3cMXAKzDqjV99sv0IxUO8sukVZm+ZTb+MfpxecnqvW11OCCGEEEIIcXyScEl8peZdfl747RKKKjycf9vww57+pZTC9867NPz+98R27cJ55pnk3vFTTMXFX/m65n+tJby+BdeZfXGeXnLINfg+rKb9zW1kXFCKI/wv+OQRsGbCTe+Cp/Tg148naX+7Cv8nuzBkWcn8WgWmYuchXV98tY2tG3lo8UMsqF2w38f1mh6XyYXb7MZldpFhzqCfux9XDLyCEteRBZ6HqiHYwIaWDXsFSVvat3SunAaQa8ulPKOcMXlj+Hrl13GYHEe1RiGEEEIIIYQ4Wg4ULsna0QKAeDTBO39fg8lmYNr1gw47WApv2ED9b35LcNEizAMG0Oef/8B+yildem1wST3h9S24z+uHc1LRYV3fMamI8OdVtM3ahMn0AqZRV8DZD4Bt355OuyXDcYIrG/HPryFeH8R+SgHu6WXoTLKiW3dqCjXxlxV/4eVNL+MwOrhj3B1MKJyAN+qlLdJGe6Sd9kg7bZG2ve5rDDYyf9d8/rXmX5xWchrXDr6WsXlju733VTAWZE3zGlY3rWZ142pWNa2iIdjQ+Xi2NZv+Gf25ZMAllGeUU55RTr+MfrhM3dOTTAghhBBCCCF6q68MlzRNywN+AxQqpc7VNG0wMF4p9fcer04cNfNf2kxLTYAZ3xuBzXXoq0PFW1tp+vOfaZ35HHqnk7xf3o3niiv221NpfxLeCG1vbMVU5sYx8dCWZO8U8aN98CsyG2ZSr/sLLdb/Ife8U/cbEqmkIrKljcDSekKfN0M8iSHPRtb1g7EOkn423SkcD/P0uqf531X/SzQR5euVX+fbI76N2+zu8jkagg08t+E5XtjwAnN3zqXCU8E1g6/h3LJzMesPfRW+pEqytW0rq5tSIdKqxlVsbttMUiUBKHYUMzZvLMNzhlOZWUl5Rvkh1SuEEEIIIYQQJ5KvnBanadqbwD+AnyulRmiaZgCWK6WGHY0CD4dMizs021Y1MefxVYw4o4RTLxtwSK9V8TitM5+j8c9/Jun34/na18j53m3oMzK6fg6laP7POsIbW8n74WiM2dZDfAfA5vdh9g+hfSec9C3CZT+k6d9bsI3JI/OyPT2eYk0hgkvrCS5rINEeQbMYsI3MwT42D2ORQ1aC60ZKKd7c9iaPLnuU2kAtU0umcvuY2yl1lx72OcPxMHO2zeE/a//D5rbNZFoyuaLiCq6suJJsa/Z+X9MSbmFz62Y2tW1iU+smNrVtYnPrZoLxIABOk5Nh2cMYlj2M4TnDGZo9lEzLgUe6CSGEEEIIIcSJ6rB7LmmatlgpNU7TtOVKqVEd961QSo3smVKPnIRLXRdoizDzV5/hyDRz2U/Hojd2vZFyYP586n/7WyKbNmMbfwp5d9110GbdBxJc1UjLs+txn1uKc8oh9tQJtsA7v4AVz0D2QLjgz9AnNQ2v/e0qfHN3knFJOZqmEVhaT7TKCxpYBnqwjcnDOigL7RDes+iaFQ0r+MPiP7CqaRWVmZX8ZOxPOKngpG47v1KKRXWLeHrt03xY/SEGnYHpZdOZXjad+mD9XiFSc7i583UZ5gwGeAZQnlHOkKwhDM8ZTl9X32O6gbgQQgghhBBCHCuOpOdSQNO0LEB1nOgUoL2b6xNpoJKK9/65lngswVnfHNLlYCm6fTv1v/s9/g8+wFhcTNGf/wfnGWcc1qifRCBG26wtGIscOE4thnWzoX4tmJ2pzeLqOHbtuc/sBKMd1s+GN34MoRaY9GOY/BMwWjrP7TqjL5Gt7bS9vBkAQ44V1zml2Efloncf+lQqcXBJlWRJ3RJmbpjJu9vfJceaw68m/ooZ/Wag78IqfYdC0zROKTiFUwpOYbt3O8+ue5ZXNr/CrC2zALAarPR392dS8SQGZAyg3FPOQM9AsixZMjpNCCGEEEIIIbpZV0YujQb+DAwFPgdygMuUUqt6vrzDIyOXumbZ29tZ8MoWpl5TyeBTv7rPUcLvp/lvf6P5X/9GMxrJ/va3ybz+OnTmww9qWp7fQHBFI7m3jcC04c/w4e+6+EoNUFAwAi54DAqG779mbwT/wloslZmYSpwSLPSAqvYqZm2ZxetbX6c2UIvdaOfawdfyjSHfwGa0HbU6vFEvqxtXU+IsodhZLKORhBBCCCGEEKKbHfbIJaXUMk3TpgAVpH6j36CUivVAjeIoatjuZdFrW+k/KodBEwsO+lyVTNL+yis0PPIoiaYm3BdfTM6PfogxN/eIaghvbCW4rAHnacWYlv0SlvwfjLoGpv8R4iGI+PZsYS9EvHvf5yqAUdeB/sD/GetdZtxnlR5RnWJf7ZF23q56m9e2vMaqxlXoNB3jC8bzw9E/ZGqfqVgNh9E36wi5TC4mFk086tcVQgghhBBCiBNdV1aL0wPTgdKO55+laRpKqYd7uDbRQ6LhOO88tQab28Rp11QedDRPcOlS6h/4DeG1a7GOHEneXx/HOuzIe7knI3FaX96EIceCq+1+WP8yTPwhnHEvaFpqepvVc8TXEd0nlozx6a5PmbVlFvN2ziOWjFGeUc7tY27nvH7nkWs7srBRCCGEEEIIIUTv1JWeS7OBMLAaSPZsOeJo+Pi5jXibQlx0+ygsduN+nxOrqaHhoYfwznkTQ34+hX/4A67zz+u2aWXet7eTaI+Q0+dZtPUvw1m/hgnf65Zzi67b5d/Fe9vfIxQPEY6HCSfChONhQvHQPvfVBmppi7SRacnkyoormdF/BoMyB8lUQyGEEEIIIYQ4wXUlXCpWSu2/oY3odTYtrmf9gjrGTi+lcMC+I4NUNErz3/9O09+eACD71lvJuumb6Gzd1zsnUtWOf34NDtcCzA3PwUV/g5FXddv5Rde0hlu54a0bqAvUAWDUGbEYLFj1ViwGS+dm1Vtx2VwM8AzgzL5nMrFoIkbd/kNJIYQQQgghhBAnnq6ES29qmnaWUuqdHq9G9ChvU4h5z6wnv5+LceeV7vN4cNlyan95N9HNW3CefTZ5P/0JxqKibq1BxZK0Pr8Wvb4FV+JxuOq/MPDsbr2G+GqJZII7PrqDllAL/zn3PwzJHiKBkRBCCCGEEEKIw9KVcGkh8IqmaTogRscyXUopV49WJrpVPJbgnb+vAeDMG4eg0+9ZSSvh89Hw8MO0zXwOQ34+xX99HOfUqT1Sh/f1ZcRb4mTb/xfd9TOhzyk9ch1xcI+vfJwFtQu4d/y9jMwdme5yhBBCCCGEEEL0Yl0Jlx4GxgOrlVKqh+sRPUAlFe//ax3127ycc8tQXNl7VvLyvvsu9b/6NfGmJjKvu5ac738fnd3eI3VEly3AtyiMzfwZlm/9DvKG9Mh1xMF9uPNDnlz1JBeXX8ylAy9NdzlCCCGEEEIIIXq5roRLO4HPJVjqvRbN3srmJQ2Mv7g//UelVvSK1ddT/+tf43v3PcwVFRT/5bFuWQXuQNT6d2h9sQadLhf3LZdDXr8eu5Y4sJ3endz18V0MyhzEz07+WbrLEUIIIYQQQghxHOhKuLQVmKdp2ptAZPedSqmHe6wq0W3Wza9l6ZvbGTyxgFFn9UElk7TOnEnjHx9GxePk/L/bybrhBjRjD/XbadwIH/4O/4okseSNZF5SiL5QgqV0CMVD/Gjej9A0jYdPexiLwZLukoQQQgghhBBCHAe6Ei5t69hMHZvoJao3tDLvmfUUV3qY/PUKolu2UPuLuwmtWIF9wnjy770XU58+PXPx5i3w4e9Qq14gqKbTnrwZS6Ub6zgJltJBKcWvF/6aja0b+cu0v1DsLE53SUIIIYQQQgghjhNfGS4ppe47GoWI7tVaF+CtJ1bjzrVxzreGEnj3HWruvAudxULh7x7EdcEFaJrW/Rdu2QYf/QFWziSp89DqfJJQYz7m/m48l1X2zDXFV3ph4wvM2jKLW0fcyqTiSekuRwghhBBCCCHEceSA4ZKmaY8ppW7TNG02sE+/JaXUBT1amThsIV+U1x9biU6vcd53huJ96m80Pf441pEjKf7z/2DIyen+i7Zuh48fghXPgs5ApOIuWraeSqI5gfvcvjgmFaPpJFhKh9WNq3nwswc5tehUbhlxS7rLEUIIIYQQQghxnDnYyKXrgNuAh45SLfulaZodeByIAvOUUs+ks55jXTyWYM5fVxNoj3LBdyrx/eoufO++i/vii8m/7150pm6e2dheDR89BMufBk1Djb4Jr7oW3/xWDJkGcr8zFFOJs3uvKbqsNdzK7R/eTq4tlwcnPYhO06W7JCGEEEIIIYQQx5mDhUtbAJRSH3b3RTVN+z/gfKBBKTX0C/efA/wJ0ANPKaUeBC4BXlRKzdY07TlAwqUDUErxwb/XU7e1nTMuLSR817eJbNpE7p13kHn99d07JS2ZhAWPwQe/AqVgzPXEh36PljfaiO5oxTYmj4wL+qMz67vvmuKQJJIJfvrRT2kJtfCf6f/BbXanuyQhhBBCCCGEEMehg4VLOZqm3X6gB49wtbh/Ao8B/959h6ZpeuAvwJlANbBY07RZQDGwuuNpiSO45nHvs9nb2LS4njHjzGj3fJNYLEbJE0/gmHRq914o0Ayvfhs2vQOV58M5vyVYZaH1/zYDkHlVBbYRud17TXHI/rLiLyysXcj9E+5ncNbgdJcjhBBCCCGEEOI4dbBwSQ84gG5vlKOU+kjTtNIv3X0SsFkptRVA07SZwIWkgqZiYAUgc3oOYP2CWpbMqaJ/YRjXoz9EX1RE8eOPY+5X1r0XqvoUXroJgk0w/SGSw26gbdZWgsu3Y+rrIvPKCgyZssR9OiWSCd6uepv/Xf2/XDrgUi4ecHG6SxJCCCGEEEIIcRw7WLhUq5S6/6hVAkXAzi/crgZOBv4HeEzTtPOA2Qd6saZp3wK+BdCnT58eLPPYs2tDK3OfXk+OuZ2S//4Cx4TxFD38R/TubpwGlUzAxw/DvN+Apwxueo9IqJSWP68g0RrGOa0PrtP7oOmlaffRlkgm2Ni6kcV1i1lcv5il9UvxRX0MzhrMXSffle7yhBBCCCGEEKJHKKVAKTSdjENJt4OFS8dESqCUCgDf6MLzngSeBBg7duw+q9sdr9obQ7z5t1XY4m1Ufvgrsq+7ltyf/BjNcLB/tYfI3wAv3wxb58Gwy0lO+wPt7zcRWLwKvcdMzi3DMZdKP5+j5UBhEkBfV1/O6nsW4/LHcVrJaZj15jRXK4QQQgghhBDdr37rZl7/0++IBAIMnjKN4dPOJrOwON1lnbAOlkBMO2pVpOwCSr5wu7jjPnEA8WiCOQ8vIOEPM2rF/9Dnvp+Tceml3XuRrfPgpZsh4kPN+DMh/Tm0PbaBZDCGY3IxrjP6oDNJ0+6eFEvGWN+8nqX1S1nasPSAYdLYvLHk2fPSXK0QQgghhBBC9BylFKs/eJsP/vEEVpebosohLH9zFktff4XiQUMZPu1sBpw8EUN3r5QuDuqA4ZJSquVoFgIsBgZomlZGKlT6GvD1o1xDrxHeupV3fjeXFq2M0Y2zGfTEH7GNHt19F0jE4cPfwUd/gOyBxC98mdZPNCIbN2AsdpB941BMhY7uu57oFIqHWN24ujNIWtW4ilA8BEAfZx/O6nsWY/PHMjZvLPn2/DRXK4QQQgghhBBHRywS5v2//5U1H75P3+GjmP69H2NzuQm0tbLmw/dZ/f7bzHnsj1j+8QSDJ5/OsGlnk13SN91lnxA0pY7+DDJN0/4LnAZkA/XAPUqpv2uaNh14lFQz8f9TSj1wOOcfO3asWrJkSTdVe2xJ+Hw0Pf5XVr+7mQ3lX2NIYRuT7zwfXXemsu27UtPgtn+KGnEtfvfteOfWgqbhOrsvjvGFaLpjYtbkccEf9bOsYRlL6pewrH4Za5rXEE/G0dAY6BnImLwxjM4bzejc0eTYctJdrhBCCCGEEEIcda21u5j98G9p3Lmd8Zd+jVMu/Ro63d6zaFQyyc61q1n13lts+mwByUScwoGDGDbtbPqPPRmVTJKIxYhHI8SjUeKxKPFolEQ0SqzjGKB40BCcmdnpeJvHPE3Tliqlxu5zfzrCpZ6iadoMYEZ5efnNmzZtSnc53UolErS9/DKNjzxKa9zJstE/prDcxYzbx6HrrqBHKVj2L3jnbkgmiI7/M62ry4jVBrAMyiTjwnIMGdLD50hFE1FWNKxgYe1CFtUtYk3TGhIqgUFnYGjWUEbnjWZM3hhG5o7EZXKlu1whhBBCCCGESKuNiz7l7b8+ik5vYPr3fkzZyDFf+Zqgt521H77Pqg/eobWm+pCvmVvan35jTqL/6HHk9SuXpuEdTohwabfjbeRScMkS6n7zGyJr16EfM575hdehGY1c+bOTsDiM3XOR5i0w+wdQ9THJkml4Xb/AvyyAzmnCc0F/LEOy0DQZrXQ4EskE61vWp8Kk2kUsb1hOOBFGr+kZkj2EUwpO4eT8kxmeMxyLwZLucoUQQgghhBCiS5RSNG7fhr+lmbx+5dgzPN16/kQ8zsfP/oOlb7xGfvlAZvzoTlzZuYdc4651a6jdvAG90YTB9IXtC7d3PxaPRtm+ajlbln5G7cb1KJXEnuGhbNQ4+o85ib7DRmK0dP33tkQ8Rjwaw2yzHerbPyZJuNQLxWpqaHjoIbxz3sRQUEDOj3/MR5sL2LWpjUt+PIa80m4Y1ZKIw6K/wgcPoHRGQoMeoW1dCUlfFPspBbjPLkVn6caV504QjcFGPqz+kE93fcpndZ/hjXoBKM8oT4VJBSczNm8sDpP0rRJCCCGEEEL0HiG/jx2rV7Bt+VKqVi0j0LqnXXNGXgGFAysprBhE4cBBZJX02WfqWlf5Wpp4/dHfU7NhLSPPPo8p196EwdhNgyu6KOhtp2rFUrYsW0zViqVEQ0H0RiN9hgynbNRYjBYrYb+PsN9P2O8l5PcT9nkJ+/2E/Kl9LByi3+hxXHzHPUe19p4i4VIv433nHWp+8lPQNLJuuomsb97I4ndrWTKnitOurmDIpKIjv0j9GnjtNqhZRrTPtbSFrie6M4yx2EHGBf0x95EpWV2llGJL2xbmVc9j7o65rGpaBUC+PZ9TCk7pDJSyrTJvVwghhBBCiONVa10NNlfGMTtKJZlM0FpbA4DV6cJid6DTHzz8SSYT1G/dTNWKZWxbuZS6TRtRKonF7qDP8FGUjRhNRl4BdVs2UrNxPbs2rCXY3gaAyWolv7yCwoGDKBpYSV7/Aej0BpKJOMlEomPbc5yIx1HJJO2N9bz/978SC4c585bvMWjilJ7+o/lKiXiMXevXsmXpZ2xd+hlt9bWdj2k6HRaHE4vDidXhxOJwpI6dTix2J1nFfRhw8oQ0Vt99JFzqZWJ1dTQ+8gg5P/gBxsJCqlY38cZfVlE5Pp/Trxt0ZFPU4hH46CH45GGSpkLa8/5IYKMVnc2A++wybGPzpGF3F8STcZY3LGfeznnM3TmXnb6dAAzJGsLUkqmcVnIaAz0DZTqhEEIIIYQQR1GgrRWlFA5P5lG7Zs3G9Sx46b9UrViKwWii/KTxDJkyjT7DRhz2yJ0jpZTC19RI7eaN1G3ZSN3mjdRv3UwsEt7reWabvTMM6QxInE4sdgdt9XVUrVpO2OcFTSO//wBKR4yhbORo8vsP3G8wpZTC21hPzYZ17Nq4npqN62jaXoVSyUOqP7OohAtu/xlZxSVH9OfQE3a/RwCLw4nJajthfu+TcKkXa28M8cJvF+PMsnDpT8ZgMB3BD6edn8Frt6EaNxIs+DntDRNJhhKpKXBn9kVnO7rDDHubWDLGx9Uf8/6O9/mo+iPaIm0YdUZOKjiJ00tOZ0rxFPLseekuUwghhBBCiBOOt6mBz159gdUfvItKJik/6RRGn3MBRYOG9Ngv/l8MlaxOF6PPvQB/awvr539IJBDAkZnFoElTGTJ5Wo+EJEqp1ApoiTixUIj6bVuo2x0mbdnUOYJIbzCQW9qf/PKB5PUrR6fXd07n2j19a/d0rnDAR8jnIxzwY3O5KR0xmtKRY+g7bCQ2l/uw6oyGgtRu3kjj9m0A6PR6dHpDx16PXq9H0+vR6w3oDHr0BiNFlYMxmqUn7bHmhAiXjsfV4uLRBC/9YSm+5jCX3zUOd4718E6UTML798GnfyJqm0ir7qfEmnSYSl1kXNAfU6H0/jmYja0beXXzq7yx9Q1awi24TC4mF09maslUJhZNxG60p7tEIYQQQgghTkhfDJUAhp1+JiarjdUfvEPY7yOnTymjzr2AylOnYDR1z+rXXw6Vxs64hJFnn4fJkvp9LR6NsmXpZ6z96H22rViKSibJLx/IkMnTqJg4GavDuc85Q34fbXU1tNXXpfZ1tbTV1xFoayERj5OMx0kmk6n9F6aU7UPTyCoqIb//QPLLB5LffwA5fUvRGw5tIIFKJkHTTpgROaJrTohwabfjZeSSUooP/rOe9fNrOe/W4ZQOP8x+PYk4zLqNxIo5tLt/TbChDJ3TRMZ5ZVhH5MgPiwNoj7TzxtY3eG3La6xtXotBZ+C04tO4qPwiJhRNwKiTUV5CCCGEEEKki7epsSNUegdIhUonXXR552pisUiYdZ98yPK3ZtO0owqLw8nwaWcz4qzph7zi2G61mzYw/8VnDxgq7U+grZV1n8xjzYfv07SjCr3BQL8xJ5FZWEJbfW1HiFRDJBDY63WOzCwy8gtweLLQG43o9YaO0T16dAYDOp0utdfr0en0GExmcvqWkdev/Jjt+SR6PwmXeqE1H+9i3jMbGDu9lJMv6Hd4J4lHiD39Y/ybnATVWSgMOE4twjWtBJ1ZVoH7skQywfya+by6+VXm7pxLLBmjMrOSi8ovYnrZdDyW7l1aUwghhBBCCHFovipU+jKlFNVrV7P8rdfZvHghwEGnzCmlUqOC4nHi8RjJeJzWuho+e+V5th1CqLS/OhqqtrL2w/dZ98k8wgE/rpxcMvIKyMgvJCMvv3PvzsvvtlFWQnQnCZd6mYbtXl76w1KKBno4/7YR6A6xwbZKKsKf1+J/bS6RQB/QJbGPLcQxqQhjjqTYX1btq+alTS8xa/MsGkINZJgzOK/feVxUfhGVmZXpLk8IIYQQQvRSOz5fySf//TfuvHzGX3YVmYXF6S4prZRShHxefE2N+Jqb8LU0EWxrRWcwYDSZMVosGExmjGYzBrMZo2nPXgEr35nTGSoNnXoGJ190Ba6cro9C8jY2sOKdN1j9/tuEA37snkw0TSMRi5GIx0nEU3v283vy4YZK+5NMJlBJhd4gX/iL3kXCpV6mbls7n76wmfNuHY7F0fXpV8lwnMDievzzq0m0RtFrjdiHGrBfdC56u0zj+qJEMsEnuz7huQ3P8cmuT9A0jUlFk7io/CKmFE/BqJc/LyGEEEIIcXjCAT8fPf1/rP7gHVw5uQS97SSiMQZPnsopl15FRl5+ukvsEUopAm2ttOzaSWvtrlSA1NSIr6UZX3Mj/uZm4rHoYZ9fpzccVqj0Zakpc/PYtW4NOoMBvcGI3mBITT/bfdu45z6T1Ub/sScfcagkRG8n4VIvpJTqcj+kWGMQ//wagksbUNEEJvN2HOo5rJd9A234JT1cae/SHGrmlc2v8MKGF6gJ1JBjzeHSgZdy6YBLybcfn3/JCyGEEEKIo2fz4oW89/fHCba1MXbGxYy//OtEg0EWz3qRle+8STKZYMhpZ3DKJVcedu+fdFNK4WtupLl6J83VO2jZtTN1vGvHXr2DNJ0OR2YWzsxsnFnZOLNzUvsv3La53CSTSeLRCLFIhHgkQizasY9EOu9PxKIUDxp6RKGSEOLInBDh0vG4WtxXiTeHaJu9lfD6FtBr2AY7cDTcjynwKVzxHxh4VrpLPCYopVjWsIzn1j/HuzveJZ6Mc3L+yVxRcQVT+0yV5txCCCGEEOKIBdpa+eCfT7Jxwcfk9CnlrG//gPz+A/Z6jr+lmUWvPs+q995G02DYtHM4+eIrcHgye7Q2lUwSi4SJhIJEQyGioSDRYIhoOHU7EgySiEX3TA3bPU3sS9PFErEYgdZmmndVEwuHOs9vdbnJKi4hq6hPal/cB09BEXaPB51O36PvTQhx9JwQ4dJux8vIpYNRShFYVEf7nK2gaTgnFWGvjKN/6RIINMFVM6FsUrrLTDtf1McbW9/guQ3PsbltM06jkwvLL+Tyisvp5z7MJulCCCGEEEJ8gVKKdR/PZe6//pdYOMQpl17FuAsuPWg/HW9TAwtffo7P576LXm9gxFnTOenCy7C5M7p8zWgoSKCtlUBbK8H2tv0fe9uJBgNEw+H99hE6kL2mh3VMDdMZjBgMhlSQVNKnM0jKLCrB5nJ3+dxCiN5LwqXjSLwtQutLG4lsasM8IAPPpQMwxHbAvy+EWBCueRmKx6S7zLRJqiSLahfx6uZXeX/H+0QSEQZlDuJrlV/jnNJzsBmlobkQQgghhOge3qYG3vvfv7BtxVIKBlZy9i0/IKu4pMuvb6urZcFL/2Xdx/MwmEyUDBlGMpHY74ihL96OhUMkYrF9zqfT67G53NgyPNgzPNhcGZjtdkxWGyarFbPVhrFjb7JaO+5PHRtMJvQGAzq9ocvtOYQQJxYJl44DSimCSxtom70FlMI9vR/2k/PR6lbBfy4GTQ/XvQp5Q9JdalpU+6p5bctrzNo8i5pADU6Tk+ll07mo/CKGZO27xKgQQgghhDiwph1VbFq8AHdOHuUnjZdGxh2UUkSCAfzNTamV4J57GpTi1KuuZ+TZ0w97Cljzrp0seuV5mnZux2AwpppMd44e2ncEkdFsxu7OSAVIbg/2jAxsGR6sDieaTtfN71oIIVIkXOrlEt4orS9vIry+BVOZi8zLBmLIskLTJnhqGphdcN1rkNU/3aUeVcFYkPd2vMerm19lcd1iNDTGF47novKLOL3P6Zj15nSXKIQQQgjRa7Q31LN+/kes//RDmnZUdd5vNFsYcNJ4Bk+eRsnQYb2yh07Y7ycc8HfpufFoBH9zE97mJvwtTakVz76wfbHXUN/hozjz5ttw5+b1VOlCCHHMOFC4dOBJwOKYoJQitLKRtllbSEaTuM/vh2NCIZpOg4gPZl4NOgPc8AZ4+qa73KNCKcXqptW8vOll3qp6i0AsQImzhNtG3sYF/S+gwFGQ7hKFEEIIIXqNoLedjQs+Yd2nH1KzYS0AhQMHcfqN32bgyRNprath7UcfsHHBJ6z9eC6OzCwGTZrK4ElTyS7p/s+f0XCIll3VtDfUY7SYsTpcWBwOLA4nZrv9oMFWLBKmra6W1tpdtNbW7LUP+byHV5CmYc/w4MzKJqu4hNLhozpXOXPn5JHXf4CMkBdCnPBk5NIxLOGP0vbaFkKrmzD1ceK5fCDGnI5+QUrB89fB+tdTI5bKJqe32KMgEAvwxtY3eH7D82xo3YDVYOWsvmdxUflFjMkbI3+pCyGEEEJ0UTQUZPOSRaz/ZB5Vq5ajkkmyivsw6NTTqJw4GXdu/j6viUUjbF36GWs/+oBtK5aikklyy/ozZPLpVE6c0uVG1LsFve20VO+kedfO1DL2u3bSsqsaX3PjgV+kaVhsdiwOZypwcrow2+yEvG201Nbgb27a6+kOTyaegqKOrRBrF5tO6w0GHFnZuLJysHs86A2ysrAQQoBMi+t1wpvbaPnvepLhOK4z++KcVIym/0J48skj8N69cNavYcL30lbn0bC2eS0vbHyBN7a+QSgeojKzkssHXs55/c7DbrSnuzwhhBBC9GK7PwufCF9SeZsa2LpsCduWL2bH6pXEY1Gc2TkMmjiFylNPI6dPaZfPFWxvY/2nH7Lmow9o2LYFTacjq6gETa9H0zR0Oh2aToempfadt3U6YpEILTXVhL8wkshgNpNZWExWUWrlsayiEtx5+cSjUcIBX2pKm89LyO8n7Pd9afNjdbnw5BemQqTCVJiUkV8gfaKEEKKbnRDhkqZpM4AZ5eXlN2/atCnd5RyRWH2A1pc347m4HGP+lwKULR/A05fC4Avhsn/AcfhhKBgL8lbVWzy/4XnWNK/Bordwbtm5XD7wcoZmDz0hPgAKIYQQ4sgppQi2t9HeUI+3sZ72xga8jfV4mxrxNtTjbWzA6nIz4sxzGTbt7ONqOfVkIkHNpvVsW7aYrcsW07RzOwDuvHz6jRpHxfhJFA6sPOLmz007t7Pu47m01OxCqSQqmdqSyT3HSqmO2wn0BiOewqK9giRnVrY0oRZCiF7ghAiXdjseRi5B6sPQPiFK63Z48jRw5MFN74HZkZbaesqWti3MXD+T17e+jj/mpzyjnMsGXsaM/jNwmVzpLk8IIYQQx6iw379nelX1Dlp27aStoR5fYwPxWHSv51qcLtw5ubhycnFl59K4fRs7Pl+J3mikcuIURp0zg7yyw1skJehtp27LRnQ6PUaLNbXUu8WSOrZY0RuNPfolWcjvo2rFUrYuW0zViqWEA350ej1FFYPpN3ocZaPHkVlYLF/UCSGEOCzS0LsX2ucv/VgInr8Wkgn42jPHVbC0vmU9T656kne3v4tJZ+LM0jO5YuAVjModJR9+hBBCCAHsGYWU6s9T3REi7aB5VzWB1pbO5xmMJjxFxeSU9KX/mJNw5eTizslLhUk5ufudKtW0czsr3n6dNR99wJp571FUOZhR58ygfNx49IYDf2SOhoJUr1vDjs9XsuPzlTRu33bQ96DT6zFaLJgsNowWC3qDAZ1e3zllTNe51+91GyAei5GIxUjG48TjqePE7n0sRiIeJxoOgVJYXW76jz2ZslHjKB0xCrNNWgkIIYToOTJyqbdQCl69FVY+C1c9BxXnpLuibrGmeQ1PrHyCuTvn4jA6uHrQ1Vw96Go8Fk+6SxNCCCFEGiTicXxNjbTV19JWX0d7Qx1tdbW019fS1lC/1xLwJqu1Y1pVH7KKO6ZYFffBlZNz0BXFDiYc8LNm3nssf/t12uvrcGRmMeLM6QyfdjY2dwbxWIzajes6wqRV1G3ZSDKRQG80UlQxiJIhIyiuHJLqLRQOEQ2HiIbDREOhztuxjtvRcJBkIpGaQpZI7DWNrPP+jttooDcaMRiM6I1GdAZD57HeaETfcWxxOCgdPpr8/gNkmpkQQohuJ9PiervFT8Eb/w+m3AlT70p3NUdsVeMqnlj1BB9Vf4TT5OTawddy9aCrZeqbEEIIcQJRStG8czubFy+kev0a2upq8DY1psKUDnqjEXdOHhn5Bbjz8snIK0g1fi7ugyMzq8dGOCeTCbYtX8ryt2azfdVy9AYDef0G0FC1lXg0gqbpyO8/gD7DRlAyZDiFFYMwmsw9UosQQghxrJBwqTfbsQj+eR70n5oatdSLv4Va3rCcJ1Y+wac1n+I2u7l+8PVcVXkVDtPxM8VPCCHEwSmlUMkkOv3hjSwRvVsykaBmwzo2L1nA5iWLaK+vAyCntB+ZhcVk5BWQkZffGSQ5PJlpH4HTvGsnK95+g7otGykcUEmfYSMoHjRUppoJIYQ44Ui41Fv56uCJKWC0wrfmgrXnp4utaVrDwtqFnFJ4CoMyB6HTjuwDXSwZY2n9Up5a9RSL6haRacnk+iHXc2XFldiN8qFMCCFOJCGfl1d//ysC7a1cfMc9ZBWVpLskcRTEImGqVi1ny+KFbFm2mLDPi95goM/QEfQfewr9x5yEIzMr3WUKIYQQ4itIQ+/eKB6F56+HiBeuffmoBEtNoSa++/53aQ43wzLItGQysXAiE4smMqFwQpd6IcWTcda3rOezus/4rO4zltcvJxgPkmXJ4sdjf8zlAy/HZrT1+HsRQghxbPE2NfDSA7+kvbEek9XGzLt/woU/+QXFg4YetRr2uxKr6HYhv4+m7dtSq7CtWcX2lcuJx6KYbXb6jR5H/7GnUDZyNCarfB4QQgghjgfH1cglTdNmADPKy8tv3rRpU7rLOXJzfgqfPQGX/h2GXdbjl0skE3zr3W+xqnEVfz3jr9QGavlk1yfMr5lPW6QNDY1h2cOYWDSRU4tOZUjWEPQ6PYlkgg2tG1hct5jP6j5jWf0y/DE/AP3c/RiXP45x+eOYUjwFi8HS4+9DCCHEsadpRxUv/fYeYuEwF/3kbpzZ2bz023vxNtRxzndvp3LC5B6voXr9Gt56/BFCXi/OrGyc2TmpfVY2zqycPfvsbOmd00XJRIKWmmoad1SlwqQdVTRu34a/pbnzOc7sHPqPOZnycadQPGjoQVdeE0IIIcSxTabF9TafvwQv3gjjb4OzHzgql3x8xeP8deVf+dXEX3FR+UWd9yeSCdY2r+WTXZ/wya5PWN20GoUiw5xBhaeCtS1r8UV9AJS6SjvDpHH548i2Zh+V2oUQQhy7qtev4dXf34/BZObSn91PTp9SIDW65bU//Ipd69cy+epvMHbGJT0yqiiZTPDZKy8w/4VncefmUTpyDP6WJnzNqS3Y3rbPayxOF7ml/Rg69UwGnDQBg9HY7XUdy5RSRAIBgt42gt52Qt52Ql5v53HQ207Lrmqaq7eTiMcB0OkNZBUVk923jJw+peT0LSOnbxk2d4aMFhNCCCGOExIu9TaBZpj/P3D63aDv+W/4FtUu4uZ3bmZG/xk8cOrBw6y2cBvza+bzac2nbGzdyJCsIYzLH8fYvLHk2fN6vFYhhBC9x+Yli3jj0d/hzM7h0p/djzt3778n4tEobz3+CBsWfMyIs87j9G9867CXkN8ff2sLbz72EDs+X0XlxCmccdN3Mdv2nooVj0bxtzTja27sDJy8TQ1sX7Wc9oZ6LA4ngyefzvBpZ5NV3Kfbajta4rEYIW87Yb+vY/MT8nsJ+/173Rf2+wj5fakgyeclmUjs93wmqxWry40nv5DsPqXk9i0ju28ZmYVF6A0nVggnhBBCnGgkXBIH1BRq4rJZl+E2u/nvef+VfkhCCCG6xeoP3uHdJx8jr385F99xDzaXe7/PU8kkH//3Xyye9RL9xpzE+d//KUbLkU+jrlqxlDl/eZhYOMzpN97C0NPOPKQRNCqZZPvnK1n9/ttsXryQZCJO4cBBDJt2NhXjT8Vo7lqNSimC7W20N9QTi4RJxGLEY9E9++gXb8dIxKJoOh0GkwmDydyx/8Kx0dR5XzKeINjeRtDbRqCtrfM42L57aycSDBywNr3BgMXpwmJ3YHE4sTic2FwurC43Npc7tXe6sLozUredLgwmU5f/DIUQQghxfJFwSexXIpnglvduYWXDSp4971kGeAakuyQhhBC9nFKKz159gU9m/pvSEaOZcftdmCzWr3zd8rdfZ+4/niSvX38u+ukvsWcc3kIWiXicT5/7D4tnvUR2SV/O/+EdRzziKNjexpqPPmD1+2/TWrsLk9XGoFNPY9i0s8kr608ymcDf3ExbfS1tdbX77GORcJevpTcYSCaTqGTykOu0OJzY3BnY3G5sbg/2jlDI5s7A4nRisTuxOFJBktXpxGAyy5Q1IYQQQnSZhEtiv/668q88vuJx7p9wPxcPuDjd5QghxDFt8eyXaaurYer135LRGwegkknm/ut/Wf7WbAZNmsrZ3/7BITVw3rxkEW/86ffYMzK45K77yCwsPqTrtzfU88affk/t5g0MP+McTrv+5m5tzq2UYte6Naz64G02LvyERCyGIyubUHtbZ+8hSAVE7tx8MvILyMgrwJ1XgDs3D7PVht5kxGA0oTd+YW8yoTcY0RsMaDodkArJ4tEoiViUeDRKLBohHo3udZ+m02FzZ2B3Z2B1uaVZthBCCCF6lIRLYh+f1X7GTe/cxPn9zueBUx+Qby6FEOIgPnvtRT5+9p8AFFUO4aKf3I3F4UhvUfuxc+1qgu3tVIw/9ahfOx6L8dZfHmbDgo8Zc95FTLnmxs6g5FDUbt7AK7+7H5VMMuNHd1I4cFCXwryNiz7lnb/9D0opzrrl+z3+ZxD2+1n78VxqNq7DlZ3TGSRl5BfgyMzq1t5RQgghhBDHAgmXxF6aQk1cPvtynCYnM8+bKX2WhBCHLBGPnzCjJFa+O4f3nnqcigmT6T/2ZN5+/BE8BUVcctd9OLOOjVUxO6eiPfcfUIrh087h9Btv6ZYGyyGfl0BrS6rpcyC1RTr2Yf+e47a6WlprdzH5mhsZN+OSI7pmW30dL//2HlprdwGgNxox2+yY7Q4sNjtmux2zzY7F4cBss+NvaWbtx3PJ7z+A835wBxl5+Uf8voUQQgghxN4kXBKdEskE337v2yxvWM6z5z3LQM/AdJckhOhl6rZs4rl776TPsBGcdu038RQUpbukHrP247m8+ZeH6Td6HBfc/jP0BgM7Pl/Jaw/9GrPNwaU/u5+s4pK01hgNBXnzL4+wefECKiZMxpWTy+LXXqRw4CAu+H8/O+zeRfFolE+ff5qlr7+KUvvp/6NpqaDH4ehsCD106plUTph8hO8oJeT3sWnRp4R8PiIBP5FAgHAwkDru2IcDqb1SijHnXcSpX7tWViwTQgghhOghEi6JTn9b+Tf+suIv3DfhPi4ZcGTfLAshTjzxWIxn7vohgbbWjpWtYow6dwbjL/0aZps93eV1q02fzWf2Iw9SMngoF99x715TsxqqtvLyb+8hEYtx0R33UFQxKC01ttRU89pDD9Bau4sp19zI6OkXomkaGxZ8zFt/fRSL3cGF/+/n5Jcf2hcJtZs28Nbjj9BSU83QqWdSOmJMR4DkSI0esjsw22yHNe2tuymlSCYSJ8xIOiGEEEKIdJFwSQCwuG4xN71zE9PLpvObU38jfZaEEIfs0+f+w8KXn+PiO+8ht7Q/n8z8N2s+fB+r08WpX7uWoVPPPC56zVStXMarv7+f3LL+XPaLX+93tbP2hjpe+s0v8TU3c/4Pf0r/MScf1Ro3L1nEm4/9Eb3BwPk/vJM+Q4fv9XhD1VZee+gBAm0tnHnzbQyZMu0rzxmPRpn/4rMsmfUy9sxMzv7W9ygdOaan3oIQQgghhOhFTohwSdO0GcCM8vLymzdt2pTuco45zaFmLp99OXajnefOf076LAkhDln91s088/PbGTzpdM659Yd73f/BP5+kZsNacvqWMfWGb1EyeFj6Cj1C1evX8NIDv8RTUMgVv/ztQRt3B73tvPLgvdRv28KZN9/GsNPP6vH6VDLJ/BefZeFLM8nrN4AL/t9duLJz9/vckM/L648+yI7PVzHq3BlMueabBxzhU7d5I2/99VGaq3cwdOpZnHbdN4+70WhCCCGEEOLwnRDh0m4ycmlfkUSEW9+7lZWNK3lm+jNUZFakuyQhRC+TiMd4+q4fEfZ5uf6hx/cJXJRSbFjwMR898w98TY0MOHkCU665EXdu72qsXL91M8/f/zPsnky+du+D2NwZX/maaDjE7Id/S9XKZUy88lpOvviKHhsZGg74mfPnh9i2fAlDTjuDM75561eupJZMJPjw6f9j2ZzXKBkynPN/eAc2l7vz8XgsxoIXnmFxx2ils771PcpktJIQQgghhPgSCZdOYLFkjNvn3s686nn85tTfMKP/jHSXJITohT59/hkWvvRfLr7jHvqNHnfA58WiEZbMfpnPXnsRlUwy5ryLGHnWeTgys476VNxYJIzBZO7ydZurdzDz3jsxWSxcee/vcGXndPlaiXicd/72J9Z+PJcRZ53H6d/4VrdPD2zaUcVrDz2At6mRqTd8ixFnnntIf6ZrPnyfd//3MewZHi788S/ILe33pdFKZ3LadTfJaCUhhBBCCLFfEi6doBLJBHd8fAdvV73NL07+BVdWXpnukoQQvVD9ti08+/PbqZw4hXO/e3uXXuNrbuLjZ//Juk/mAWCy2sgqLiGruM8XthKcWTndGjoF29vYuGg+G+Z/RPX6NVgdTvL6DyC/cxu439XT2upqmXnvHaAUV973Ozz5hYd8bZVM8vF//8XiWS/Rd/goigcN7WyCbXE4v7A5MFv3bYatkkmi4TDRUJBoKEgkGCQaDhENBfE21PPpC89gttqYcfvPDruBeN3mjbz2xwcI+/1UjD+VtR/Pxe7O4Kxbvk/ZqH0+JwghhBBCCNFJwqUTUFIlufvTu5m1ZRY/Hvtjrh9yfbpLEkL0Qol4jGd+djtBbzs37Gc63FdpqNrKrg1raa7eSUv1Dpp37STY3tb5uNFiJauoOBU2lfQlt7QfuaX9sDpdXb5G2O9n02fz2bDgY3Z8vhKVTJJZVEL52JMJtLdRv2UTzdU7USoJgCMrm/x+XwibPB5e+d39RENBrrznt2T3KT2k9/hly+a8xvwXniUSDBzwOZqmw+xIrbiWiEaJhELEwqGDnrewYjAzfnQnDk/mEdUXaGtl1sO/pWbDWoZMOYPTrr8Ji/3Q/r0KIYQQQogTj4RLJxilFL9e+Gue3/g83x35Xb494tvpLkkI0UvNf+FZFrz4LBf99O5uWw0t6G2nZddOmqt30rxrB807d9BcvYNAW2vncxxZ2eT2LSO3rD+5ffuRU9oPd25e5yinaCjI5iWL2DD/I6pWLieZiJORV0DFhMlUTJhEdknfvUZERcMhGrZtoX7rZuq2bKJuy0ba6mo7HzdZrVx+92/I7z+gW94jpIK5sN/fsfkIB3x7jv0+Qn4/kYAfg8mM2WbFZLV1bKlj85duu7Jz9hntdPi1xWlvqCOzsLhbzieEEEIIIY5/Ei6dQJRSPLTkIf699t/cOPRGfjj6h0e9z4kQ4vjQULWVZ372IyomTGb6bf+vx68X9LbTWLWNhu1baazaSkPVVlp2VXeOODJZbeSW9sNktbJj9UrisSjOrBwqJkyiYvwk8vqVH9LPu7DfT93WTTRu30bfYSPJLe3XU29NCCGEEEKIXk/CpRPIY8sf44lVT/D1yq9z50l3SrAkhDgsiXicZ35+O4HWFm54+K9YHc601BGLRmjesZ2GjrCpYftWgu1tlI0cS+WEyRQOrOy20TxCCCGEEEKIAztQuGRIRzGi5zy1+imeWPUElwy4hDtOukOCJSHEYfvstRdorNrKhT/+RdqCJQCjyUx++UDyywemrQYhhBBCHH9isRjV1dWEw+F0lyLEMcdisVBcXIzRaOzS8yVcOo48s+4Z/rTsT0wvm84vT/klOk2+yRdCHJ7G7dtY+NJzVE6cQvm4U9JdjhBCCCFEt6uursbpdFJaWipfygvxBUopmpubqa6upqysrEuvkfThOPHSxpd48LMHmdZnGg+c+gB6nT7dJQkheqlEPM5bf30Ui8PB6d+4Jd3lCCGEEEL0iHA4TFZWlgRLQnyJpmlkZWUd0qg+CZd6OaUUs7fM5r4F93Fq0an8fvLvMehkQJoQ4vAtnvUSDdu2cMZNt2J1utJdjhBCCCFEj5FgSYj9O9T/NyRc6oWUUnze9DmPLn2UC169gJ998jPG5Y/jkdMewaQ3pbs8IUQvFY9G+Xzeeyx48b9UTJjMgJMmpLskIYQQQojj1tSpU3n77bf3uu/RRx/lO9/5ziGfa9asWTz44IMA3HvvvTz00EMA3HDDDbz44ouHdK6nn36a4cOHM2TIEEaMGMFNN91EW1sbAKeddhoVFRWMGDGCiRMnsmHDBi6++GJGjhxJeXk5brebkSNHMnLkSObPn8/VV19NRUUFQ4cO5cYbbyQWix3yexO9gwxx6SXiyTjL6pfx/o73eX/H+9QH69Fresblj+PqQVdzYfmFWAyWdJcphOiF2urrWPXem6ye+y5hn5fsPqUyHU4IIYQQooddddVVzJw5k7PPPrvzvpkzZ/L73//+kM91wQUXcMEFFxxxTW+99RaPPPIIb775JkVFRSQSCf71r39RX19PRkYGAM888wxjx47lySef5Cc/+QmzZs0CYN68eTz00EO8/vrrnedra2vj6aefBuDrX/86Tz311GGFZ+LYd1yFS5qmzQBmlJeXp7uUbhFJRFhQs4D3d7zPvJ3zaIu0YdabmVA4ge+P/j5TiqfgNrvTXaYQohdKJhNsW76Ule+8wbaVy9A0jfJxpzDyrPMoGTJchogLIYQQQvSwyy67jF/84hdEo1FMJhNVVVXU1NQwadIkvvOd77B48WJCoRCXXXYZ9913HwClpaVcf/31zJ49m1gsxgsvvEBlZSX//Oc/WbJkCY899tgBr3f//fcze/ZsQqEQEyZM4IknntjnM98DDzzAQw89RFFREQB6vZ4bb7xxv+ebPHkyjz766EHf4/Tp0zuPTzrpJKqrq7vyRyN6oeMqXFJKzQZmjx079uZ013Kk3tv+Hj//5OcE40EcRgdTSqYwrc80JhZOxGa0pbs8IUQvFWxvY/Xcd1n13pt4GxuwezIZf+nXGDbtbJyZ2ekuTwghhBAiLe6bvYa1Nd5uPefgQhf3zBhywMczMzM56aSTePPNN7nwwguZOXMmV1xxBZqm8cADD5CZmUkikWDatGmsWrWK4cOHA5Cdnc2yZct4/PHHeeihh3jqqae6VM9tt93GL3/5SwCuvfZaXn/9dWbMmLHXc9asWcPo0aO7dL7Zs2czbNiwLj03Fovxn//8hz/96U9der7ofY6rcOl4Up5RzvR+0zmjzxmclH8SRr0x3SUJIXqxus0bWfbmLDYu/IREPE6focOZcs2N9B97CnqD/FUghBBCCJEOu6fG7Q6X/v73vwPw/PPP8+STTxKPx6mtrWXt2rWd4dIll1wCwJgxY3j55Ze7fK25c+fy+9//nmAwSEtLC0OGDNknXPqi1atXc+211+Lz+fjNb37DlVdeCcDVV1+N1WqltLSUP//5z1269q233srkyZOZNGlSl+sVvYv8RnGMKnWXcs/4e9JdhhC9RnP1DjYs+JixMy7BZLGmu5xjRvX6NSx6+TmqVi7DZLUx/MxzGXHGdLKKS9JdmhBCCCHEMeNgI4x60oUXXsiPfvQjli1bRjAYZMyYMWzbto2HHnqIxYsX4/F4uOGGG/ZaEt5sNgOpKWvxeLxL1wmHw9x6660sWbKEkpIS7r333v0uMz9kyBCWLVvG1KlTGTZsGCtWrOC2224jFAp1Pmd3z6Wuuu+++2hsbOSJJ57o8mtE7yPhkhCi19u8ZBFz/vwQsXCI7atXcsmd92K2nbjTR5VS7FyzioUvzWTn2tVYXW4mff0GRp41HZP1xP1zEUIIIYQ41jgcDqZOncqNN97IVVddBYDX68Vut+N2u6mvr+fNN9/ktNNOO6Lr7A6SsrOz8fv9vPjii1x22WX7PO+uu+7ixz/+Ma+99hrFxcUAewVLh+qpp57i7bff5v3330enk8Xqj2cSLgkhei2lFItefo5Pn3+avH4DGHraGcz915O89MDdXPKz+7DYHeku8ahSSlG1YikLX36Omo3rsHsyOe26mxl+xtkYzbKapBBCCCHEseiqq67i4osvZubMmQCMGDGCUaNGUVlZSUlJCRMnTjzia2RkZHDzzTczdOhQ8vPzGTdu3H6fN336dBobGzn33HNJJBJkZGQwdOjQvVa0OxTf/va36du3L+PHjwdSU/p2930SxxdNKZXuGrrd2LFj1ZIlS9JdhhCiB8XCYd7666NsXPgJgyZN5cxv3YbRZGbz4oXMfuRBsvv05bKf/wqr05XuUnucSibZvHQRi15+jvqtm3Fm5XDShZcxdOqZGEymdJcnhBBCCHFMWrduHYMGDUp3GUIcs/b3/4imaUuVUvvMi5SRS0KIXqe9oZ7X/vArmnbuYPI1NzL2/Is7l1EtH3cKF/7k58z642944f6fcdkvfo3NndGj9TTuqKKttga7x4PDk4Utw4PB2L1N+FUySSQYJBzwE/b7CAf8RAJ+Am2trP7gHZp2VOHOy+esW77P4MlT0RtkEQAhhBBCCCHE0SHhkhCiV9m5djWzH/4tyUSCi++8h7KRY/Z5Tr9R47jop7/ktT/8muc7AiaHJ7Nb6wgH/Kz/9CM+n/su9Vs37fO4xenC4cnE4cnE7snE4cnC7vFgdThJxOPEIhHikTCxaIR4JLJn37mFiQQCRHaHScEAHGCkqaewmHO/ezuVE6eg0+u79X0KIYQQQgghxFeRcEkI0SsopVj5zhzm/utJMvIKuPAnd5NZWHTA55cOH8Uld97DK7+7n+fvu4vLf/kAzszsI6shmWTn2tWs/uAdNn+2gHgsSk6fUqbe8C2KKgYTbG/D39ZCoKUFf2tqC7Q207RzO4G2VlQyud/z6g0GDGYzRpMZo8WCwWTGYDZjc7nwFBRicTixOBxY7A4sDidmuwOL3Z663+7AnuFBkwaJQgghhBBCiDSRcEkIccxLxGN88H9PsOr9t+g3ehzTv/eTLq0GVzJkOJf+7H5efvAenrv3Tq64+ze4cnIP+frexgbWfPg+n897D29jPWa7nSFTz2TY1DPJLevfOSXvYJLJBCGvl7Dfh8FkwmAyYzSbMZjMMtpICCGEEEII0atJuCSEOKYF2lqZ9fBvqdmwlpMvvoIJV1yNTtf1MKaocjCX/fzXvPSbX/LcfXdy+d2/ISMv/6CviUXCNFfvpKFqKxsXfsL21StAKfoMG8mpV11H+bhTMJrMh/Q+dDo99gwP9gzPIb1OCCGEEEIIIY51Ei4JIY5ZLTW7eOk3vyTY3sZ5P/gplRMmH9Z5CgZUcPndD/DiA3fz3H13csXdD+ApKCKZTNBeX0fjjiqadlTRtGM7TTuraK2r7exv5MrJZfylVzFkyjTcuXnd+faEEEIIIYQQ4rgg4ZIQ4is1VG1l1ftvM/GKq7E6XUflmjUb1/PK7+9H0zSuvOe35JcPPKLz5fUrTwVMv/4FM++5A2dWDs3VO4hHI6knaBqe/AKyS0qpnDiF7D6lZJeU4skvkH5GQgghhBCiRzgcDvx+f+ftf/7znyxZsoTHHnusW68za9Ys1q5dy5133nlYr//444/59re/jdFoZMGCBVit1m6tT/R+Ei4JIQ6qaUcVL/z6F4R9Xuo2b+Tyu3+N2Wbv0WtuXrKIN/70exyeTC792f1k5Bd0y3lzS/tx5b0P8s4Tf8ZgNjPizHPILiklu08pWcUlGM2WbrmOEEIIIYQQx5ILLriACy644LBf/8wzz3DXXXdxzTXXdGNV4ngiX8cLIQ6oeddOXvj1LzAYDEz75q00bt/Gy7+9l2g41GPXXPXeW8x66AGyivtw1a/+0G3B0m67z3v5L37NadfdzNCpZ5Lff4AES0IIIYQQ4phyww038OKLL3bedjgcACSTSW699VYqKys588wzmT59eufz5syZQ2VlJWPGjOH73/8+559/PpAaEXXbbbd1nvf73/8+EyZMoF+/fp2vPdB5n3rqKZ5//nnuvvturr76avx+P9OmTWP06NEMGzaM1157rbPGf//73wwfPpwRI0Zw7bXXAtDY2Mill17KuHHjGDdu3P9v787jYzrbx49/7oQsxL62lkfsgghiq9IQ+xJLqWqftupHq+WpalEalFZaVFFVT79tkWptRbWh1aKiltqC1BIeSi2x1i4kIsn9++OcTLMvJzMScb1fr3nlzFmuc505mTNn7rkXtm3b5vgXT9x3UnNJCJGmaxfOseK9QAD6Tnifko9WpFCxYqyZOZUfPnyPnm+9k+1OrTOiteb35YvZsXIJnj6N6TZiDC5uUt1WCCGEEELcB2vHwIUD9o1Zvj50npLhKtHR0fj4+NieX716NdMaRt999x0nT54kIiKCS5cuUadOHQYOHEhMTAwvv/wymzdvxtPTk/79+6cb4/z582zdupUjR44QEBBAnz590o07aNAgtm7dSrdu3ejTpw9xcXGsWrWKokWLcvnyZZo3b05AQAARERFMnjyZ33//ndKlS3P16lUAhg8fzogRI3j88cc5ffo0HTt25PDhw1l/HcUDQQqXhBCp3Pz7EsvfCyQuLo5+ZsESQM1mLek0dARrP53B6o/eJ2DkOAoULJjj/SXEx7P+i085GLqOem3a027QUJwLyOVJCCGEEELkb+7u7oSHh9ueJ/a5lJGtW7fSt29fnJycKF++PG3atAHgyJEjVK1aFU9PTwD69+/P559/nmaMnj174uTkhJeXFxcvXswwbkpaa95++202b96Mk5MTZ8+e5eLFi2zcuJG+fftSunRpAEqWLAnAhg0biIiIsG1/8+ZNoqKibDWxRP4g396EEMncunKZb997m9joO/Qd/z6lK1dJ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\n",
      "text/plain": [
       "<Figure size 1440x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create plots\n",
    "plt.figure(figsize = (20, 8))\n",
    "plt.plot(time_per_seq_vanilla_gpt)\n",
    "plt.plot(hftime)\n",
    "plt.plot(trtime)\n",
    "plt.plot(openvino)\n",
    "plt.plot(time_per_seq_onnx_gpt)\n",
    "plt.plot(time_per_seq_onnx_rnn)\n",
    "plt.plot(rnn_163Mn)\n",
    "plt.ylabel(\"Time in Seconds (log)\")\n",
    "plt.xticks(\n",
    "  ticks = np.arange(len(text_lengths) // 2) * 2,\n",
    "  labels = np.array(text_lengths)[np.arange(0, len(text_lengths), 2)],\n",
    "  rotation = 90\n",
    ")\n",
    "plt.xlabel(\"Sequence Length to Generate\")\n",
    "plt.legend([\n",
    "  \"Vanilla GPT2\",\n",
    "  \"Huggingface\",\n",
    "  \"Vanilla T2RInfer\",\n",
    "  \"OpenVino T2RInfer (166 Mn)\",\n",
    "  \"ONNXRuntime GPT2\",\n",
    "  \"ONNXRuntime T2RInfer (2.5 Mn)\",\n",
    "  \"ONNXRuntime T2RInfer (166 Mn)\"\n",
    "])\n",
    "plt.title(\"Time taken to generate (beam_size = 10) given 10 input tokens\")\n",
    "plt.yscale(\"log\")\n",
    "plt.savefig(\"./raw_time_log.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "f4a4b896",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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ucSM65bw/7HWdruAPrOAaGvti6WXrGwyxiwHPrfWfuh0FhERkeLQiCQREZHLgDHmWmNMHffUtrtwreeyqLB+5ZG19oi1trWKSGWDtXZjYUUkY0wn95RTD2PMAFyjxP57SQKKiIhIiVIhSURE5PLQCtiAaxrOE8At7vWj5BIwxiw0+S9u/Tens5URdXCtO5QEvAM8aK1d72giERERKRZNbRMRERERERERkSLRiCQRERERERERESkSFZJERERERERERKRIKjgd4GIEBATYxo0bOx1DREREREREROSysXbt2qPW2sD8tpXrQlLjxo2JiIhwOoaIiIiIiIiIyGXDGLO3oG2a2iYiIiIiIiIiIkWiQpKIiIiIiIiIiBSJCkkiIiIiIiIiIlIk5XqNJBEREREREZHzSU9PJzY2lpSUFKejiJQ5vr6+NGjQAC8vryL3USFJRERERERELluxsbFUrlyZxo0bY4xxOo5ImWGtJSEhgdjYWJo0aVLkfpraJiIiIiIiIpetlJQUatasqSKSyDmMMdSsWfOCR+upkCQiIiIiIiKXNRWRRPJXnO8NFZJERERERERESknv3r1ZvHhxrra33nqLBx988IKPNW/ePF577TUAJkyYwJtvvgnA6NGjmT179gUd6/PPPyc0NJTg4GDatWvHPffcQ2JiIgC9evWiVatWtGvXjh49erBt2zZuuukmwsLCaN68OVWrViUsLIywsDB++eUXRo0aRatWrWjbti1jxowhPT39gq9Nyg8VkkRERERERERKyciRI5k5c2autpkzZzJy5MgLPtaQIUN45plnLjrTokWLmDx5MgsXLmTLli2sW7eO7t27c+jQoex9ZsyYwYYNG7jrrrsYN24cc+fOJTIykg8//JCePXsSGRlJZGQk3bt3Z9SoUURHR7Np0yaSk5P58MMPLzqjlF0qJImIiIiIiIiUkltuuYXvv/+etLQ0AGJiYjh48CA9e/bkwQcfJDw8nODgYF588cXsPo0bN+bFF1+kQ4cOhISEEB0dDcD06dMZO3bsec/38ssv06lTJ9q2bct9992HtTbPPhMnTuTNN9+kfv36AHh6ejJmzBhatWqVZ99rrrmGnTt3nvecgwYNwhiDMYbOnTsTGxt7/hdFyjXdtU1ERERERESuCC99t4WogydL9JhB9arw4o3BBW6vUaMGnTt3ZuHChQwdOpSZ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5dChQ3h4eHDbbbcxc+bM7P4zZ85k5MiRgGukzNGjR4mJiaFNmzbce++9BAcH079/f5KTkwGIjIyka9euhIaGctNNN13Q6JjevXtTsWJFALp27UpsbGyefTw9PencuTMHDhzIs23ChAmMGTOGXr160bRp0+yRQA888AC7d+9m4MCBTJ48mdOnTzNmzBg6d+5M+/bt+fbbbwFXAWjIkCH06dOHvn375jn+jBkzGDp0aPbzvn37Urly5Tz7/fvf/+aFF17Aw8NVLqlVqxYAX3zxBcOHD6dRo0a52vNz2223MWvWLAC+/PLL7M/B2ZzDhw9nwIABtGjRIlfBbciQIXz55ZcFHresqOB0ABERKZsWborD39uTni0CnI4iIiIiUiLi//53UrdGl+gxfdq0ps7f/lbg9i1bttCxY8dcbVWqVKFRo0bs3LkTgD/++IPNmzdTsWJFOnXqxA033IC/vz+zZs1i9erVeHl58dBDDzFjxgzuvPNOTp8+TdeuXZk4cSJPPfUUH3zwAc899xwjR47k3nvv5emnnyY1NZUFCxYwadKkPJl27NjBl19+yQcffMBtt93GnDlzuP3227nzzjt59913ufbaa3nhhRd46aWXeOutty74Nfnoo48YOHBgnvaUlBR+//133n777Xz7RUdHs2zZMk6dOkWrVq148MEHee+991i0aBHLli0jICCAv/3tb/Tp04dp06aRmJhI586due666wBYt24dGzdupEaNGrmOm5aWxu7du2ncuHGh2Xft2sWsWbOYO3cugYGBvPPOO7Ro0YLt27eTnp5Or169OHXqFI8++ih33nlnvse4+eabufvuu3nyySf57rvvmDFjRq7RT5GRkaxfvx4fHx9atWrF//3f/9GwYUOqV69OamoqCQkJ1KxZdpeWUCFJRETyyMjMYvGWePq2qY2vl6a1iYiIiJSmfv36ZRcOhg8fzqpVq6hQoQJr166lU6dOgGuNn7OjYLy9vbPX9unYsSNLliwBIDw8nKSkJLZt28bWrVvp0qVLnqIKQJMmTQgLC8vuHxMTw4kTJ0hMTMxe++euu+7i1ltvveBr+fzzz4mIiODnn3/Obtu1axdhYWHs2bOHG264gdDQ0Hz73nDDDfj4+ODj40OtWrU4dOgQDRo0yLXPDz/8wLx583jzzTcBV3Fq37592a9jftd79OjRIk/rS01NxdfX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\n",
      "text/plain": [
       "<Figure size 1440x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create plots\n",
    "plt.figure(figsize = (20, 8))\n",
    "plt.plot(time_per_seq_vanilla_gpt)\n",
    "plt.plot(hftime)\n",
    "plt.plot(trtime)\n",
    "plt.plot(openvino)\n",
    "plt.plot(time_per_seq_onnx_gpt)\n",
    "plt.plot(time_per_seq_onnx_rnn)\n",
    "plt.plot(rnn_163Mn)\n",
    "plt.ylabel(\"Time in Seconds\")\n",
    "plt.xticks(\n",
    "  ticks = np.arange(len(text_lengths) // 2) * 2,\n",
    "  labels = np.array(text_lengths)[np.arange(0, len(text_lengths), 2)],\n",
    "  rotation = 90\n",
    ")\n",
    "plt.xlabel(\"Sequence Length to Generate\")\n",
    "plt.legend([\n",
    "  \"Vanilla GPT2\",\n",
    "  \"Huggingface\",\n",
    "  \"Vanilla T2RInfer\",\n",
    "  \"OpenVino T2RInfer (166 Mn)\",\n",
    "  \"ONNXRuntime GPT2\",\n",
    "  \"ONNXRuntime T2RInfer (2.5 Mn)\",\n",
    "  \"ONNXRuntime T2RInfer (166 Mn)\"\n",
    "])\n",
    "plt.title(\"Time taken to generate (beam_size = 10) given 10 input tokens\")\n",
    "plt.savefig(\"./raw_time.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bf140073",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5ec44af7",
   "metadata": {},
   "outputs": [],
   "source": [
    "np.argsort()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "9c419388",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(1, 1, 50257), (1, 64, 768), (1, 1, 64)]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[x.shape for x in ort_outs]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "df61d07c",
   "metadata": {},
   "outputs": [],
   "source": [
    "wpe = model.wpe.weight.data.numpy()\n",
    "wte = model.wte.weight.data.numpy()\n",
    "vocab_ = np.arange(tinyconf.vocab_size)\n",
    "\n",
    "def generate(\n",
    "  input_ids,\n",
    "  max_length,\n",
    "  num_return_sequences = 10\n",
    "):\n",
    "  # if just a sequence, batchify\n",
    "  if len(input_ids.shape) == 1:\n",
    "    input_ids = input_ids.reshape(1, *input_ids.shape)\n",
    "\n",
    "  # since the hidden states for all `num_return_sequences` will be same\n",
    "  # we first run those and then tile\n",
    "  B, S = input_ids.shape\n",
    "\n",
    "  assert B == 1, \"Only 1 sequence at a time can be generated\"\n",
    "  \n",
    "  # get the first set of embeddings and hidden states\n",
    "  emb = wte[input_ids] + wte[:S]\n",
    "  s = np.zeros((1, tinyconf.n_embd // tinyconf.n_head, tinyconf.n_embd)).astype(np.float32)\n",
    "  z = np.zeros((1, 1, tinyconf.n_embd // tinyconf.n_head)).astype(np.float32)\n",
    "  \n",
    "  for i in range(emb.shape[1]):\n",
    "    ort_inputs = {\n",
    "      \"input_ids\": emb[:, i:i+1, :],\n",
    "      \"s\": s,\n",
    "      \"z\": z\n",
    "    }\n",
    "    logits, s, z = ort_session.run(None, ort_inputs)\n",
    "    # s = s[0]; z = z[0]\n",
    "  \n",
    "  # randomly select tokens for next step\n",
    "  new_tokens = np.random.choice(vocab_, size = (10,), p = softmax(logits[0][0])).reshape(-1, 1)\n",
    "  s = np.tile(s, [num_return_sequences, 1, 1])\n",
    "  z = np.tile(z, [num_return_sequences, 1, 1])\n",
    "  \n",
    "  for i in range(S+1, max_length, 1):\n",
    "    emb = wte[new_tokens] + wpe[i:i+1]\n",
    "    ort_inputs = {\n",
    "      \"input_ids\": emb,\n",
    "      \"s\": s,\n",
    "      \"z\": z\n",
    "    }\n",
    "    logits, s, z = ort_session.run(None, ort_inputs)\n",
    "    new_tokens = np.vstack([\n",
    "      np.random.choice(vocab_, size = (1,), p = softmax(l)).reshape(-1, 1) for l in logits[:, -1, :]\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "9513450a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 100/100 [14:42<00:00,  8.83s/it]\n"
     ]
    }
   ],
   "source": [
    "sample_input = np.random.randint(low = 0, high = vocab_size, size = (10))\n",
    "time_per_seq_onnx_rnn = {}\n",
    "for _, max_length in zip(trange(len(text_lengths)), text_lengths):\n",
    "  st = time()\n",
    "  generate(sample_input, max_length)\n",
    "  time_per_seq_onnx_rnn[max_length] = time() - st"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "504438b4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_values([0.8078258037567139, 0.9528629779815674, 1.023085117340088, 1.3267102241516113, 1.5955471992492676, 1.8665919303894043, 1.8290178775787354, 1.8734238147735596, 2.214817762374878, 2.4527370929718018, 2.6101157665252686, 2.7773261070251465, 2.825166940689087, 3.0728960037231445, 3.1171422004699707, 3.2865490913391113, 3.8310091495513916, 4.0839550495147705, 4.0467541217803955, 4.544752836227417, 4.173032999038696, 4.358557939529419, 4.804854154586792, 4.600397109985352, 5.0456459522247314, 5.197699069976807, 5.374312162399292, 5.388933181762695, 5.456713914871216, 5.8326921463012695, 5.692815065383911, 5.841047763824463, 6.03924822807312, 6.236928939819336, 6.3541340827941895, 6.537708044052124, 6.73204493522644, 7.014068841934204, 7.5250842571258545, 7.285407304763794, 7.551724672317505, 8.299933195114136, 8.144722938537598, 8.03302812576294, 8.304935932159424, 8.483222007751465, 8.32650113105774, 8.463954210281372, 8.645501852035522, 8.797425031661987, 9.641960144042969, 9.387210130691528, 9.450478076934814, 9.51991605758667, 9.653730154037476, 9.99559760093689, 10.584656953811646, 10.468290090560913, 10.465898036956787, 11.280603170394897, 10.738075733184814, 10.9172842502594, 11.13709807395935, 11.229904890060425, 11.77758002281189, 11.571346759796143, 11.731151819229126, 11.809141159057617, 12.662194013595581, 13.686334133148193, 13.289978265762329, 13.006233215332031, 12.148551225662231, 12.070403814315796, 12.83561396598816, 12.22691011428833, 12.423428058624268, 12.6525137424469, 12.68385100364685, 12.792601108551025, 12.983532190322876, 13.126617908477783, 13.338057279586792, 13.476840019226074, 13.636482000350952, 13.78541374206543, 14.068947076797485, 14.137412786483765, 14.220309019088745, 14.390641927719116, 14.576472997665405, 14.72642993927002, 14.887132167816162, 14.991446018218994, 15.274276971817017, 15.23928189277649, 15.484319925308228, 15.605724811553955, 16.027278900146484, 15.956920862197876])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "time_per_seq_onnx_rnn.values()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 268,
   "id": "94fc6d88",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_values([0.5959079265594482, 0.687363862991333, 0.75301194190979, 0.8533351421356201, 0.9747490882873535, 1.1346211433410645, 1.5717182159423828, 1.8908727169036865, 1.4194860458374023, 1.5369491577148438, 1.7827610969543457, 1.7322440147399902, 1.8739619255065918, 2.2371459007263184, 2.163003921508789, 2.167092800140381, 2.266625165939331, 2.3798720836639404, 2.505606174468994, 2.7107598781585693, 2.758840799331665, 2.9009530544281006, 3.0136170387268066, 3.0829598903656006, 3.2428767681121826, 3.333710193634033, 3.3943428993225098, 3.5502707958221436, 3.6275131702423096, 3.8873820304870605, 4.97966194152832, 6.926004886627197, 7.60387396812439, 6.169910192489624, 4.96052098274231, 4.541069984436035, 4.674930095672607, 4.807736158370972, 5.31633996963501, 5.458504915237427, 5.588108062744141, 5.786901950836182, 5.545657157897949, 5.516519069671631, 5.604123830795288, 5.9024059772491455, 6.349245309829712, 6.526838064193726, 6.617987155914307, 6.457239866256714, 6.4678730964660645, 6.700317859649658, 6.874399900436401, 6.992015838623047, 7.292781114578247, 7.231415033340454, 7.310716867446899, 7.559641122817993, 7.644207000732422, 7.988410949707031, 7.979838848114014, 7.883902072906494, 8.00269603729248, 8.03238320350647, 8.417850017547607, 8.579051971435547, 9.302956104278564, 8.779901027679443, 8.665467023849487, 9.12933087348938, 9.30663514137268, 9.424662590026855, 9.217226028442383, 9.346886157989502, 9.84749698638916, 9.890618085861206, 9.631170988082886, 9.851988077163696, 9.922441959381104, 10.366507053375244, 10.261409997940063, 10.460005760192871, 10.654867887496948, 10.981161117553711, 11.204596042633057, 10.846029281616211, 10.885334014892578, 11.595859050750732, 11.079048156738281, 11.277546882629395, 11.799643278121948, 11.756839036941528, 11.699911832809448, 12.175809144973755, 12.047747611999512, 11.78695797920227, 12.205284833908081, 12.842317819595337, 12.607604265213013, 12.716302633285522])"
      ]
     },
     "execution_count": 268,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "time_per_seq_onnx_rnn.values()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "91aaf8d8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[16.3699369430542, 16.278465032577515, 16.632145166397095, 16.529223203659058]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "openvino = list({50: 0.8308169841766357, 59: 0.9385421276092529, 69: 1.1165568828582764, 79: 1.2765130996704102, 89: 1.4416310787200928, 99: 1.6293408870697021, 109: 1.7819478511810303, 118: 1.9143421649932861, 128: 2.059094190597534, 138: 2.232140064239502, 148: 2.40683913230896, 158: 2.5497119426727295, 168: 2.717195987701416, 177: 2.8439559936523438, 187: 3.1171810626983643, 197: 3.1715948581695557, 207: 3.3493387699127197, 217: 3.4994089603424072, 227: 3.6750307083129883, 236: 3.8232548236846924, 246: 3.9808623790740967, 256: 4.163664817810059, 266: 4.583317995071411, 276: 4.583310127258301, 286: 4.672489166259766, 295: 4.858430862426758, 305: 4.918324947357178, 315: 5.102287292480469, 325: 5.300966024398804, 335: 5.502793073654175, 345: 7.916024208068848, 354: 9.381884813308716, 364: 6.780932188034058, 374: 6.352913856506348, 384: 6.500420808792114, 394: 6.815152883529663, 404: 6.956315040588379, 414: 7.163733005523682, 423: 7.183579206466675, 433: 7.287609815597534, 443: 7.648420095443726, 453: 7.841577053070068, 463: 7.861024856567383, 473: 7.98726487159729, 482: 8.216248035430908, 492: 8.442819118499756, 502: 8.333581686019897, 512: 8.349575996398926, 522: 8.693190813064575, 532: 8.815429210662842, 541: 8.82877516746521, 551: 8.983691930770874, 561: 9.351985931396484, 571: 9.420326948165894, 581: 9.446531057357788, 591: 9.79126787185669, 600: 9.925878763198853, 610: 10.005067110061646, 620: 9.90594220161438, 630: 10.42673373222351, 640: 10.369528770446777, 650: 10.969038963317871, 659: 11.338748216629028, 669: 11.508569717407227, 679: 11.2188138961792, 689: 11.422258853912354, 699: 11.534149169921875, 709: 11.492116928100586, 719: 11.815311670303345, 728: 11.94534707069397, 738: 11.941256999969482, 748: 12.272209167480469, 758: 12.487500190734863, 768: 12.45061707496643, 778: 12.9688401222229, 787: 12.84001898765564, 797: 13.045544147491455, 807: 13.321141958236694, 817: 13.282780170440674, 827: 13.46946907043457, 837: 13.7919921875, 846: 13.634413242340088, 856: 14.190178155899048, 866: 14.040977239608765, 876: 14.291153907775879, 886: 14.599408864974976, 896: 14.505081176757812, 905: 15.083547830581665, 915: 14.86729907989502, 925: 15.294875144958496, 935: 15.059892892837524, 945: 15.566175937652588, 955: 15.485416173934937, 964: 15.829054355621338, 974: 15.951651096343994, 984: 16.14839506149292, 994: 16.3699369430542, 1004: 16.278465032577515, 1014: 16.632145166397095, 1024: 16.529223203659058}.values())\n",
    "openvino[-4:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e3de3086",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
